1

我的表单没有返回空模型。

我正在详细信息页面上查看特定模型的详细信息,然后,如果用户按下 SubmitPost 按钮,视图应该返回模型。

看法

@model MyApp.Models.MyModel
@using (Html.BeginForm("ApplyUsingDetails", "Controller", FormMethod.Post))
{
    <fieldset>
        <legend>Course</legend>
        <div class="display-label">MyModel ID</div>
        <div class="display-field">
            @Html.DisplayFor(model => model.CourseID)
        </div>

        <div class="display-label">Title</div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Title)
        </div>
        etc. . .

        <p><input type="submit" value="SubmitPost" /></p>

        <more misc information for the view>
    </fieldset>
}

行动

[HttpPost]
public ActionResult ApplyUsingDetails(MyModel model)
{
// when I try to access model here it comes up null
}

提供一些背景信息:我正在使用此表格让学生查看课程的详细信息,然后单击按钮申请课程。

关于为什么我的模型会为空的任何线索?

4

3 回答 3

1

根据您提供的示例,您似乎没有MyModel在表单中包含任何 ' 字段。作为测试,请尝试包含隐藏字段或使用@Html.HiddenFor(model => model.CourseID)并查看您是否发布了任何值。

于 2012-04-24T17:16:24.167 回答
0

您需要在表单中包含输入元素,以便它们可以发布到您的控制器并绑定到您的控制器模型。ASP.Net MVC 中的模型绑定获取您提交的表单值,并在控制器模型上查找具有相同名称的属性,并尝试使用表单值设置该属性。表单中没有输入字段对模型绑定没有任何意义,无法粘贴到控制器的模型中。

我建议使用带有 css 样式的只读输入元素看起来像div.display-field.

    <div class="display-label">Course ID</div> 
    <div> 
        @Html.TextBoxFor(model=>model.CourseID, new{readonly="readonly", @class="display-field"}) 
    </div> 

根据页面上的其他样式,可能需要也可能不需要将输入包装在 div 中。

于 2012-04-24T17:33:41.427 回答
0

DisplayForHTML 助手通常会简单地返回一个表示属性值的字符串。如果您的属性是布尔类型,它会将其呈现为禁用复选框。只要您没有任何输入控件,您就不会获得价值。所以在这种情况下,您可以简单地使用@Html.HiddenForHTML 帮助器方法。

HTML.HiddenFor辅助方法为隐藏类型的输入元素生成 HTM 标记,其 id 和名称与表达式相同

@using (Html.BeginForm("ApplyUsingDetails", "Controller", FormMethod.Post))
{
   <div class="display-label">MyModel ID</div>
   <div class="display-field">
        @Html.DisplayFor(model => model.CourseID)
        @Html.HiddenFor(m=>m.CourseId)
   </div>
   <input type="submit" value="Save" />
}

现在,课程 ID 的值将在您的 HTTPPost 操作方法中可用。

于 2012-04-24T17:37:58.197 回答