【问题标题】:Model Binding using many partial views strongly typed contained within a Main View使用包含在主视图中的许多强类型分视图的模型绑定
【发布时间】:2012-02-22 18:31:10
【问题描述】:

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

类结构

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"); }

                }

            });

        }
    });
}

【问题讨论】:

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


    【解决方案1】:

    我认为您对 BasicInfo、EducationInfo 和就业信息使用了不同的局部视图。

    喜欢

    @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” .所以模型绑定器将无法将其绑定到 PersonEdit 类。

    解决方案将是 EditorFor 而不是 Partial

    使用,

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

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

    【讨论】:

    • 好的,但我没有使用@Html.partialView,而是通过不同的控制器操作方法呈现Partialview。
    • OK,在局部视图中尝试@{Html.ViewData.TemplateInfo.HtmlFieldPrefix = ViewBag.PropertyPrefix},在主视图中设置ViewBag.PropertyPrefix = "basicInfo"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多