本文介绍了从型号强类型的视图绑定多模型提交表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题提交多种模型的形式绑定。我有一个投诉表格,其中包括投诉信息以及一对许多投诉。我想提交表单,但我对绑定收到错误信息。 ModelState.IsValid始终返回false。

如果我调试和查看的ModelState错误,我得到一个说法:
该EntityCollection已经初始化该InitializeRelatedCollection方法只应调用对象图的反序列化过程中初始化一个新的EntityCollection。

此外,在调试的时候,我可以看到投诉模型并得到与投诉人从表单提交填充,因此它似乎部分工作。

我不知道我在做什么是不可能的,默认的模型绑定器,或者如果我根本不会去它的正确途径。我似乎无法找到任何这具体的例子或文件。一个非常类似的问题可以在计算器here但它似乎不处理强类型的意见。

控制器code:

 公众的ActionResult编辑(INT ID)
    {
        VAR投诉=(从_entities.ComplaintSet.Include C(投诉人)
                     其中,c.Id == ID
                     选择C).FirstOrDefault();        返回查看(投诉);
    }    //
    // POST:/主页/编辑/ 5
    的[AcceptVerbs(HttpVerbs.Post)
    公众的ActionResult编辑(投诉投诉)
    {
        如果(!ModelState.IsValid)
        {
            返回查看();
        }
        尝试
        {
            VAR originalComplaint =(从_entities.ComplaintSet.Include C(投诉人)
                                     其中,c.Id == complaint.Id
                                     选择C).FirstOrDefault();
            _entities.ApplyPropertyChanges(originalComplaint.EntityKey.EntitySetName,投诉);
            _entities.SaveChanges();
            返回RedirectToAction(「指数」);
        }
        抓住
        {
            返回查看();
        }
    }

查看code(这是得到由创建/编辑意见,这也强烈投诉类型称为局部视图):

 <%@控制语言=C#继承=System.Web.Mvc.ViewUserControl< ProStand.Models.Complaint>中%GT;&所述;%= Html.ValidationSummary()%>
&下;使用%(Html.BeginForm()){%GT;<表格的cellpadding =0CELLSPACING =0级=表>
    &所述; TR>
        &所述; TD>
        <标签=DateReceived>收稿日期:< /标签>
            &所述;%= Html.TextBox(DateReceived)%>
            &所述;%= Html.ValidationMessage(DateReceived,*)%>
        < / TD>
        &所述; TD>
            <标签=DateEntered>输入的日期:< /标签>
            &所述;%= Html.TextBox(DateEntered)%>
            &所述;%= Html.ValidationMessage(DateEntered,*)%>
        < / TD>
    < / TR>
    &所述; TR>
        &所述; TD>
            <标签=完结篇>最后总结:LT; /标签>
            <%= Html.CheckBox(完结篇)%>
            &所述;%= Html.ValidationMessage(结束的,*)%>
            < / TD>
        &所述; TD>
            <标签=IncidentDate>事故日期:< /标签>
            &所述;%= Html.TextBox(IncidentDate)%>
            &所述;%= Html.ValidationMessage(IncidentDate,*)%>&下; / TD>
    < / TR>
< /表>
    <小时/>
    <表>
    <%,如果(!模型= NULL){
           INT I = 0;
       的foreach(在Model.Complainants VAR投诉人){%GT;
       <%= Html.Hidden(投诉人[+ I +] .ID,complainant.Id)%GT;
    &所述; TR>
        &所述; TD>
            <标签=姓>姓氏:其中; /标签>            <%= Html.TextBox(投诉人[+ I +] .Surnamecomplainant.Surname)%GT;
            &所述;%= Html.ValidationMessage(姓,*)%>
        < / TD>
        &所述; TD>
            <标签=GivenName1> GivenName1:LT; /标签>
            <%= Html.TextBox(投诉人[+ I +] .GivenName1complainant.GivenName1)%GT;
            &所述;%= Html.ValidationMessage(GivenName1,*)%>
        < / TD>
    < / TR>
    <%我++; %GT;
    <%}}%GT;
    &所述; TR>
        &所述; TD列跨度= 2 - ;
            <输入类型=提交值=提交/>
        < / TD>
    < / TR>
< /表>
<%}%GT;
< D​​IV>
    <%= Html.ActionLink(返回目录,索引)%GT;
< / DIV>


解决方案

盲目猜测:

变化:

 <%= Html.TextBox(投诉人[+ I +] .Surnamecomplainant.Surname)%GT;

 <%= Html.TextBox(Complaint.Complainants [+ I +] .Surname
complainant.Surname)%GT;

分别 - 添加投诉。之前的投诉[......

修改

这是不是一个正确的答案。离开它未删除,只是因为直到正确答案弹出,可能增加一些价值。

EDIT2:

我可能是错的,但对我来说似乎有一个与实体框架问题(或 - 与你使用它的方式)。我的意思是 - asp.net mvc的管理,以读取请求的值,但不能初始化投诉集合。

该是写:

Some more info:

Somewhy InitializeRelatedCollection gets fired twice. Unluckily - i got no bright ideas why exactly. Maybe this little investigation will help for someone else - more experienced with EF. :)

EDIT3:
This isn't a solution for this particular problem, more like a workaround, a proper way to handle model part of mvc.

Create a viewmodel for presentation purposes only. Create a new domain model from pure POCOs too (because EF will support them in next version only). Use AutoMapper to map EFDataContext<=>Model<=>ViewModel.

That would take some effort, but that's how it should be handled. This approach removes presentation responsibility from your model, cleans your domain model (removes EF stuff from your model) and would solve your problem with binding.

这篇关于从型号强类型的视图绑定多模型提交表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-29 05:57