对于创建部分,我的create.aspx看起来像
<h2>Create</h2>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Create New Request</legend>
<%: Html.EditorFor(model => model.request,
new {Softwares = Model.SoftwareName, Systems = Model.SystemIDNo}) %>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
部分视图,其调用是workRequest.ascx
<p>
<%= Html.LabelFor(model => model.Medium)%>
<%= Html.TextBoxFor(model => model.Medium)%>
<%= Html.ValidationMessageFor(model => model.Medium)%>
</p>
<p>
<%= Html.LabelFor(model => model.Summary)%>
<%= Html.TextBoxFor(model => model.Summary)%>
<%= Html.ValidationMessageFor(model => model.Summary)%>
</p>
<p>
<%= Html.LabelFor(model => model.Details)%>
<%= Html.TextAreaFor(model => model.Details)%>
<%= Html.ValidationMessageFor(model => model.Details)%>
</p>
<p>
<%= Html.LabelFor(model => model.WorkHalted)%>
<%= Html.TextBoxFor(model => model.WorkHalted)%>
<%= Html.ValidationMessageFor(model => model.WorkHalted)%>
</p>
<p>
<%= Html.LabelFor(model => model.Frequency)%>
<%= Html.TextBoxFor(model => model.Frequency)%>
<%= Html.ValidationMessageFor(model => model.Frequency)%>
</p>
<p>
<%= Html.LabelFor(model => model.StartDate)%>
<%= Html.TextBoxFor(model => model.StartDate, String.Format("{0:g}", Model.StartDate))%>
<%= Html.ValidationMessageFor(model => model.StartDate)%>
</p>
<p>
<%= Html.LabelFor(model => model.SoftwareID) %>
<%= Html.DropDownList("SoftwareID", new SelectList(ViewData["Softwares"] as IEnumerable, Model.SoftwareID)) %>
</p>
<p>
<%= Html.LabelFor(model => model.SystemID) %>
<%= Html.DropDownList("SystemID", new SelectList(ViewData["Systems"] as IEnumerable, Model.SystemID)) %>
</p>
和post创建控制器看起来像
[HttpPost]
public ActionResult Create(WorkRequest newRequest)
{
try
{
storeDB.AddToWorkRequests(newRequest);
storeDB.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我在try中设置了一个断点并检查了进入newRequest的值,newRequest中的所有内容都为null,就像没有任何东西被传递一样。
在编辑方面也会发生类似的情况,根本没有任何东西从局部视图发送到控制器。
无论如何我确信它的东西相当简单,我是MVC,ASP,C#的新手,几乎所有这些。我通常不会问其他人太多,但我已经看了很长一段时间这个问题了,可以用一些新鲜的眼睛来看看这个问题。
提前致谢!
答案 0 :(得分:0)
尝试使用与用于渲染视图的参数相同的视图模型类型以及强类型化的参数:
[HttpPost]
public ActionResult Create(ViewModelUsedToStronglyTypeTheView model)
{
//model.request should be properly bound here
try
{
storeDB.AddToWorkRequests(model.request);
storeDB.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View(model);
}
}
或使用前缀:
[HttpPost]
public ActionResult Create([Bind(Prefix = "request")] WorkRequest newRequest)
{
//model.request should be properly bound here
try
{
storeDB.AddToWorkRequests(newRequest);
storeDB.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
答案 1 :(得分:0)
我相信你只需要将你的行动签名改为这样......
public ActionResult Create(WorkRequest request)
原因是发布的值的名称。它们看起来像RequestViewModel.Request.Summary
,因此请求对象的名称实际上是Request
。 <{1}}对象上没有Request
属性,因此没有任何绑定。
您可以绑定到视图所绑定的对象WorkRequest
,正如Darin Dimitrov所建议的那样。
或者,您可以按预期绑定到请求,只需要确保MVC知道如何绑定值。它只通过命名约定知道这些事情,所以如果你绑定一个子对象,你需要确保你的动作参数的名称与它的父对象的属性相同。