Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.Net MVC视图模型在post上为空_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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'