模型绑定使用主视图中包含的强类型的许多部分视图

时间:2012-02-22 09:42:32

标签: asp.net asp.net-mvc-3 model-binding

我有一个主View PersonEdit.cshtml绑定到Main类PersonEdit-它内部是许多模型的容器类,如BasicInfo,EductaionalInfo,EmploymentInfo等。 我在PersonEdit.cshtml上保存点击提交的所有信息。 View由许多部分视图组成,这些视图由AJAX异步调用的不同Action方法加载。 我面临的问题是在PersonEdit.cshtml上单击Submit时不会发生Model Binding,因为Partial视图中的名称与Model Binding的预期名称不同。

班级结构

public class PersonEdit
{
    BasicInfo basicInfo { get; set; }
    EducationalInfo eduInfo { get; set; }
    EmploymentInfo empInfo { get; set; }

}

请告诉我如何在这种情况下完成模型绑定。

我正在加载像这样的部分视图:

//Basic Info
$(document).ready(function () {
    DisplayBasicInfo();
});

function DisplayBasicInfo() {

    var $MainContent = $("#divBasicInfo");
    var resourceURL = "/Home/Home/GetBasicInfo";
    var personID = $("#PersonEdit_PersonID").val();
    personID = 0;


    $MainContent.css("text-align", "center");
    $.ajax({
        cache: false,
        type: "GET",
        async: true,
        url: resourceURL,
        dataType: "text/html",
        data: { personID: personID },
        success: function (data) {
            $MainContent.html(data);
            $.validator.unobtrusive.parse($("#divBasicInfo"));
        },
        error: function (xhr) {

            $('#divBasicInfo').show().html("Unexpected Error in basic Info- Please contact administrator!");

            $("#divBasicInfo").dialog({

                modal: true,

                width: 'auto',

                opacity: 0.7,

                height: 'auto',

                position: 'center',

                title: 'Warning',

                buttons: {

                    'OK': function () { $(this).dialog("close"); }

                }

            });

        }
    });
}

1 个答案:

答案 0 :(得分:0)

我认为您正在为BasicInfo,EducationInfo和EmploymentInfo使用不同的部分视图。

喜欢

@Html.Partial("partialViewName",Model.basicInfo)在主视图中。

让你的BasicInfo类就像,

class BasicInfo
{
  public string FirstName{get;set;}
public string LastName{get;set;}
}

因此,在视图中(如果您将看到源代码),BasicInfo的属性名称将显示为“FirstName”或“LastName”,而不是“basicInfo.FirstName”和“basicInfo.LastName” .So Model binder将无法将其绑定到PersonEdit类。

解决方案将是EditorFor而不是Partial

使用,

@Html.EditorFor(m=>m.basicInfo,"editorFileName")

编辑器文件与部分视图相同,但将放在“EditorTemplates”文件夹结构下。此基础对象属性名称将添加到BasicInfo属性的属性名称中。