我有一个问题,应该是一个非常简单的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中它们都可以正常工作。过去两天我一直在努力调试这个问题。请帮忙!
答案 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="" />
...
所以你需要指出模型绑定器是否有这样的前缀。