0

我没有改变我曾经可以工作的代码,我什至用项目的早期版本澄清了这一点。但是,我现在收到此错误:

参数字典包含“BareCupboard.Controllers.RecipeStepController”中方法“System.Web.Mvc.ActionResult Create(Int32, BareCupboard.Models.RecipeStep)”的不可为空类型“System.Int32”的参数“recipeID”的空条目'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

我的代码是:

[HttpPost]
    public ActionResult Create(int recipeID, RecipeStep newRecipeStep)
    {
        try
        {
            var recipe = db.Recipes.Single(r => r.recipeID == recipeID);
            recipe.RecipieSteps.Add(newRecipeStep);
            db.SaveChanges();
            return RedirectToAction("Index", "Recipe");
        }
        catch
        {
            return View();
        }
    }

我试过:int?recipeID,但这不起作用。我所看到的任何可能发生的想法都是神秘主义在这里发挥作用!

4

2 回答 2

1

为什么您发布的数据中的 recipeID 为空?这是您的问题, var recipe = db.Recipes.Single(r => r.recipeID == recipeID)无法获得recipeID=null,因为r.recipeID不可为空。

于 2012-11-14T15:29:18.237 回答
1

检查您的视图代码以了解参数的顺序。模型绑定器需要它以正确的顺序出现。那里很容易出错。

更新

这是解决此问题的一种方法。创建一个视图模型如下:

    public class RecipeViewModel
    {
       public int RecipeId { get; set; }
       public RecipeStep RecipeStep { get; set; }
    }

在控制器中,您将拥有以下内容:

    public ActionResult Create()
    {
        var recipeId = 10 // however you want to select that Id

        var recipeViewModel = new RecipeViewModel {RecipeId = 10}

        return View(recipeViewModel);
    }

  [HttpPost]
  public ActionResult Create(int recipeID, RecipeStep newRecipeStep)
  {
     //your code
  }

在视图中,您可以执行以下操作:

@model MvcApplication3.Models.RecipeViewModel

@using (Html.BeginForm(null,null,FormMethod.Post))
{

 <div>
    <p>@Html.HiddenFor(x=>x.RecipeId) </p>
    <p>@Html.TextBox("RecipeStepData1")</p>
     <p>@Html.TextBox("RecipeStepData2")</p>
    <p>@Html.TextBox("RecipeStepData3")</p>
</div>
<input type="submit" value="Submit"  id="btn" /> 
}

注意顺序。我先放了 id,然后是其余的配方步骤数据,以便正确绑定。

对于开始表单,您不必在同一页面上发布帖子时指定操作和控制器。如果你放在那里,它不会受伤。

希望这可以帮助... :)

于 2012-11-14T15:39:28.160 回答