表格帖子不提交。表单对象显示为null

时间:2015-03-05 13:26:57

标签: asp.net-mvc asp.net-mvc-4 razor

当我通过单击保存按钮发布表单时,它会命中post方法,但模型参数始终为null。

控制器

[HttpPost]
public ActionResult Edit(QuestionMaster question)
{  
    if (questionLogic.Update(model))
    {
        return RedirectToAction("List");
    } 
    return View();
}

查看

@using (Html.BeginForm()) {
    <fieldset>
        <legend>QuestionMaster</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Question)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Question)
            @Html.ValidationMessageFor(model => model.Question)
        </div>
    </fieldset>
    <p><input type="submit" value="Save" /></p>
}

4 个答案:

答案 0 :(得分:3)

您尚未发布QuestionMaster的模型,但是从视图代码中可以看到它包含名为Question的属性,其类型为string。问题是你的POST方法参数也被命名为question,导致模型绑定失败,对象为空。

将参数重命名为模型中属性的名称,例如

[HttpPost]
public ActionResult Edit(QuestionMaster model)

你的模型在回发上null的原因是因为模型绑定的工作原理

  1. DefaultModelBinder初始化一个新实例 QuestionMaster
  2. 然后检查发布的表单的名称/值对。如果匹配 找到属性名称,设置该属性的值。
  3. 在您的情况下,您的回复Question="The text you entered" model binder找到名为question的参数(即匹配)和 将其设置为"The text you entered",但question是typeof QuestionMaster(一个复杂的对象,而不是string)因此绑定失败 并且模型变为空。

答案 1 :(得分:1)

HtmlFieldPrefix中传递EditorFor

@Html.EditorFor(model => model.Question, new ViewDataDictionary() { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "QuestionMaster" }})

这样,字段的名称将是正确的,模型绑定器将能够绑定它们。

答案 2 :(得分:0)

根据您上面给出的代码,您的视图缺少模型。

您可以将模型添加到视图中,如下所示:

@model QuestionMaster

此代码通常是您视图中的第一行。

除此之外,你能解释控制器动作中model的范围吗? model在哪里定义?如果未定义,您应该了解在视图中使用@Model.someValue很好,但是除非您的已发布模型参数被称为model,否则访问控制器中的model将不起作用。

假设这可能是表单“null”的另一个原因,请尝试将控制器更改为:

[HttpPost]
public ActionResult Edit(QuestionMaster question)
{  
    if (questionLogic.Update(question))
    {
        return RedirectToAction("List");
    } 
    return View();
}

答案 3 :(得分:0)

您可以按照漩涡告诉您的方式进行操作,或者只是将参数名称更改为除“问题”之外的任何内容

[HttpPost]
public ActionResult Edit(QuestionMaster question2)

[HttpPost]
public ActionResult Edit(QuestionMaster model)

[HttpPost]
public ActionResult Edit(QuestionMaster anything)