asp.Net MVC视图模型在post上为空
我有一个复杂的视图模型,我正在将其传递给创建视图。当我在页面上输入数据并发布时,模型为空。子对象中的字段和“测试”字段均为空。为什么?asp.Net MVC视图模型在post上为空,asp.net,asp.net-mvc,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我有一个复杂的视图模型,我正在将其传递给创建视图。当我在页面上输入数据并发布时,模型为空。子对象中的字段和“测试”字段均为空。为什么? public class ContactIncident { [Key] public int Id { get; set; } [DataType(DataType.MultilineText)] public string Description { get; set; } [Display(Name = "Inc
public class ContactIncident
{
[Key]
public int Id { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
[Display(Name = "Incident Date")]
[DataType(DataType.Date)]
public DateTime? IncidentDateTime { get; set; }
[Display(Name = "Follow Up Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
[DataType(DataType.Date)]
public DateTime? FollowUpDate { get; set; }
}
public class IncidentManager
{
public ContactIncident Incident { get; set; }
public string Test { get; set; }
}
public ActionResult Create(int? id)
{
IncidentManager im = new IncidentManager();
ContactIncident ci = new ContactIncident();
ci.IncidentDateTime = DateTime.Now;
ci.FollowUpDate = DateTime.Now.AddDays(14);
im.Incident = ci;
return View(im);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(IncidentManager im)
{
if (ModelState.IsValid)
{
ContactIncident ci = new ContactIncident();
ci.IncidentDateTime = incident.Incident.IncidentDateTime;
ci.Description = im.Incident.Description;
return RedirectToAction("Index");
}
return View(incident);
}
视图:
@model MyApp.Web.ViewModels.IncidentManager
@{
ViewBag.Title=“编辑事件”;
}
@视图包。标题
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@EditorFor(model=>model.Test)
@LabelFor(model=>model.Incident.IncidentDateTime)
@DisplayFor(model=>model.Incident.IncidentDateTime)
@LabelFor(model=>model.Incident.Description)
@EditorFor(model=>model.Incident.Description,new{htmlAttributes=new{@class=“form control”,rows=“5”},})
@LabelFor(model=>model.Incident.FollowUpDate)
@EditorFor(model=>model.Incident.FollowUpDate,new{htmlAttributes=new{@class=“form control”},})
}
问题在于,如果使用不同的参数名称,将无法正确映射嵌套模型。必须使用与ViewModel名称相同的参数名称
public ActionResult Create(IncidentManager incidentManager)
通常,始终使用模型名称作为参数名称,以避免映射问题
更新:
DefaultModelBinder使用“基于约定”的映射
你能展示你的cshtml吗?想知道您是如何定义表单元素的吗?我假设
ci.IncidentDateTime=incident.IncidentDateTime
是一个输入错误,它实际上是ci.IncidentDateTime=im.IncidentDateTime代码>。返回视图(事件)同上代码>正在<代码>返回视图(im)代码>(您的代码未按原样编译)。否则,您的代码可以正常工作,尽管IncidentDateTime
将为null
,因为您没有为其创建表单输入。请详细说明。你是在和班主任说话吗?如果是这样,为什么?我做了改变,而且成功了。我以前多次遇到过这个问题,并一直在解决它,但这样会更好。您必须使用与ViewModel名称相同的参数名称。他错了!。参数名可以是任何有效的名称,只要它与模型中的某个属性的名称不同。@StephenMuecke-他们可能在本文发布后更新了模型绑定器逻辑。因为这是公认的答案,这一定解决了海报问题。不管你怎么看。不,它没有改变(MVC-3、MVC-4和MVC-5在这方面是一样的)
public ActionResult Create(IncidentManager incidentManager)
IncidentManager.Incident = incidentManager.Incident (will map)
IncidentManager.Incident = im.Incident //won't map because 'im' != 'incidentManager'