MVC:为什么我的编辑控制器方法没有收到我的ViewModel的ID?

时间:2017-03-22 21:51:14

标签: c# asp.net-mvc forms razor

我正在使用MVC为我的ViewModel创建标准的创建/编辑表单。我的创建工作非常好,现在我已经进入我的编辑表单,并且ViewModel的ID被传递为0,即使我可以看到ID元素资源管理器(& web UI)ID是设置为10004.我尝试将所有字段绑定到我的[HttpPost]编辑控制器方法,但ID仍为0.任何想法?

这是我的代码片段(我有太多字段等发布所有内容,所有其他字段都是正确的。)

提前致谢!

视图模型

public class Header_VM
    {           
        [DisplayName("Contract ID")]
        public int Contract_Key { get; set; }

        etc
    }

查看

@model (root).Header.Header_VM

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit Header: @Model.Name</h2>

@using (Html.BeginForm("Edit", "Header", FormMethod.Post, new { name = "EditForm" }))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal" ng-app="HeaderApp">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.Contract_Key, htmlAttributes: new { @class = "control-label col-md-2" })
            @Html.DisplayFor(model => model.Contract_Key)
        </div>
        etc...
    </div>
}

我在&#34; int NewID ...&#34;上有一个断点,此时Contract_Key为0。

控制器

[HttpPost]
public ActionResult Edit([Bind(Include = "Contract_Key, etc...")] Header_VM header)
{
     int NewID = DB.Header_Insert(header);
     return RedirectToAction("Details", "Header", new { Contract_Key = NewID });
 }

1 个答案:

答案 0 :(得分:2)

DisplayFor辅助方法生成HTML标记,以显示属性值。因此,如果您检查页面源(查看源代码),您将看到Contract_Key属性的label标记的标记。提交表单时,仅提交输入表单字段值,而不是标签/ div值

您需要在表单中输入一个输入表单字段,其中name属性值设置为"Contract_Key"

您可以使用HiddenFor辅助方法生成隐藏的输入元素,其name属性值与属性名称匹配。

 @Html.DisplayFor(model => model.Contract_Key)
 @Html.HiddenFor(model => model.Contract_Key)

或者只是手写隐藏输入

<input type="hidden" name="Contract_Key" value="@Model.Contract_Key" />