HttpPost创建中的ASP.NET MVC错误 - POST后模型中传递的空值 - 模型绑定问题?

时间:2011-02-01 07:40:52

标签: asp.net-mvc entity-framework binding http-post

我有一个问题,应该是一个非常简单的ASP.NET MVC Create方法。

在我填充数据并在Create视图中提交表单(并且传递了所有验证规则)之后,传递给POST方法的模型实例将包含每个字段的null或0值,而ModelState.IsValid将返回false。

我使用Firebug来检查POST表单参数,并且提交操作显然已经发布了字段中的所有参数。但是,这些参数未绑定到传递给Controller中POST方法的模型,因此,模型(即代码中的材料)在所有字段中都包含空值(使用在POST开头放置的Watch和断点检查)法)。

来自Firebug的POST参数:

Content-Type: application/x-www-form-urlencoded Content-Length: 228 MaterialNoMass.MaterialNoMassID=9mmPlasterboard&MaterialNoMass.RoughnessTypeID=3&MaterialNoMass.Resistance=0.0560&MaterialNoMass.ThermalAbsorptance=0.09&MaterialNoMass.SolarAbsorptance=0.07&MaterialNoMass.VisibleAbsorptance=0.07

创建视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Database.Master"
 Inherits="System.Web.Mvc.ViewPage<MvcDeepaWebApp.ViewModels.DatabaseSimpleMaterialViewModel>" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <% Html.EnableClientValidation(); %>
        <% using (Html.BeginForm())
           {%>
        <%: Html.ValidationSummary(true) %>
        <fieldset>
            <legend>Create MaterialNoMass</legend>
            <%: Html.EditorFor(model => model.MaterialNoMass, new { RoughnessTypes = Model.RoughnessTypes })%>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
        <% } %>
        <div>
            <%: Html.ActionLink("Back to List", "Index") %>
        </div>
    </asp:Content>

在控制器中创建的GET和POST方法:

    //
    // GET: /DatabaseSimpleMaterial/Create
    public ActionResult Create()
    {
        var viewModel = new DatabaseSimpleMaterialViewModel
        {
            MaterialNoMass = new MaterialNoMass(),
            RoughnessTypes = deepaDB.RoughnessTypes.ToList()
        };

        return View(viewModel);
    }

    //
    // POST: /DatabaseSimpleMaterial/Create

    [HttpPost]
    public ActionResult Create(MaterialNoMass material)
    {
        if (ModelState.IsValid)
        {
            MaterialAllType mt = new MaterialAllType();
            mt.MatID = material.MaterialNoMassID;
            mt.MatTypeID = deepaDB.MaterialTypes.Single(type => type.MatType == "SimpleMaterial").MatTypeID;
            material.MatTypeID = mt.MatTypeID;

            deepaDB.AddToMaterialAllTypes(mt);

            deepaDB.AddToMaterialNoMasses(material);

            deepaDB.SaveChanges();
            return RedirectToAction("Index");
        }

        //Error occurred
        var viewModel = new DatabaseSimpleMaterialViewModel
        {
            MaterialNoMass = material,
            RoughnessTypes = deepaDB.RoughnessTypes.ToList()
        };

        return View(viewModel);
    }

仅供参考,每当创建新的MaterialNoMass时,还应使用相同的MaterialNoMass ID创建MaterialAllType的新实例。我还没有达到修改数据库的阶段,因为模型绑定似乎无法正常工作。

我在应用程序中的其他控制器中使用了类似的Create方法,除了在这个Controller中它们都可以正常工作。过去两天我一直在努力调试这个问题。请帮忙!

1 个答案:

答案 0 :(得分:1)

问题来自于您传递给视图的模型是DatabaseSimpleMaterialViewModel,并且在您期望的{POST}操作中MaterialNoMass。因此,请确保使用正确的前缀:

[HttpPost]
public ActionResult Create([Bind(Prefix="MaterialNoMass")]MaterialNoMass material)

我认为你的编辑模板会生成如下字段:

<input type="text" name="MaterialNoMass.MaterialNoMassID" value="" />
<input type="text" name="MaterialNoMass.RoughnessTypeID" value="" />
...

所以你需要指出模型绑定器是否有这样的前缀。