2013-04-29 2 views
1

Я имею NameModel и RegisterModel и суперкласса классов, как показано ниже: -с использованием сильно типизированных частичный вид внутри другого сильно типизированных

Случай 1: - Использование суперкласса

public class SuperClass 
{ 
    public RegisterModel Register{ get; set; } 
    public NameModel NameInfo { get; set; } 
} 

public class NameModel 
{ 
    [Required] 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
} 

    public class RegisterModel 
    {  
     public NameModel NameInfo{ get; set; } 
     [Required] 
     public string UserName { get; set; } 
     [Required] 
     public string Password { get; set;} 
    } 

MyNamePartial сильно типизированных как следует: -

@model MyNamespace.Models.NameModel 
@{ 
    Layout = null; 
} 
{ 
    @Html.TextBoxFor(m=>m.FirstName,new { @id="firstName"}) 
    @Html.TextBoxFor(m=>m.MiddleName,new { @id="middleName"}) 
    @Html.TextBoxFor(m=>m.LastName,new { @id="lastName"}) 
} 

Мой регистрационный вид строго типизирован для регистрации модели следующим образом: -

@model MyNamespace.Models.SuperClass 
@{ 
    Layout = "~/Views/_Layout.cshtml"; 
} 

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" })) 
{ 
    <div id="form"> 
     @Html.Partial("NameModel",Model.NameInfo)  
    @Html.TextBoxFor(m=>m.Register.UserName,new { @id="userName"}) 
    @Html.TextBoxFor(m=>m.Register.Password,new { @id="password"}) 
    <input type="submit" value="Register" id="btnRegister" /> 
    </div> 
} 

Вышеуказанный метод дает ошибку сравнения объекта.

Случай 2: - Использование HTML.Action и нет суперкласса попытался с помощью @ Html.Action ("MyNamePartialView") вместо @ Html.Partial ("NameModel", Model.NameInfo), Затем я использую контроллер Action метод, как показано ниже

Моей Регистрация Просмотр сильно типизированный регистр модели следующим образом: -

@model MyNamespace.Models.RegisterModel 
@{ 
    Layout = "~/Views/_Layout.cshtml"; 
} 

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" })) 
{ 
    <div id="form"> 
     @Html.Action("MyNamePartialView") 

    @Html.TextBoxFor(m=>m.UserName,new { @id="userName"}) 
    @Html.TextBoxFor(m=>m.Password,new { @id="password"}) 
    <input type="submit" value="Register" id="btnRegister" /> 
    </div> 
} 

Регистра контроллер: -

public ActionResult MyNamePartialView() 
    {    
     return PartialView("MyNamePartial", new NameModel()); 
    }  

[HttpPost] 
[AllowAnonymous] 
public ActionResult Register(RegisterrModel model) 
{ 
    @ViewBag.sideMenuHeader = "Create an Account"; 

    if (ModelState.IsValid) 
    { 
      //Perform Something 
      return View(); 
    } 
     return View(); 
} 

Вышеприведенный случай не связывает значения, введенные в форме. он устанавливает null для NameModel.

Я не хочу использовать EditorFor, поскольку я должен предоставлять html и пользовательские атрибуты для helpers. Связывание с частичным представлением fail.it дает мне ошибку ссылки на объект в представлении регистрации. Как я могу использовать такие строго типизированные частичные представления с такой такой иерархией классов модели, как описано выше?

+0

2 пути. 1) создать «суперкласс», содержащий обе модели. 2) используйте метод частичного с дочерним действием. Действие child создаст экземпляр и передаст модель просмотра в частичное. –

+0

Спасибо @DaveA. Не могли бы вы объяснить варианты? Я не понял это точно. – user2232861

+0

вы можете создать класс, который содержит как NameModel, так и RegisterModel, и передать это вашему представлению. Затем вы можете передать @ Model.NameModel своим частичным при использовании RegisterModel для привязки своих элементов управления. –

ответ

2

Самый простой способ сделать это состоит в использовании ребенок Действие

@model MyNamespace.Models.Register.SuperModel 
@{ 
    Layout = "~/Views/_Layout.cshtml"; 
} 



@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" })) 
{ 
    <div id="form"> 
     @Html.Action("MyNamePartialView") 
    </div> 
    @Html.TextBoxFor(m=>m.Register.UserName,new { @id="userName"}) 
    @Html.TextBoxFor(m=>m.Register.Password,new { @id="password"}) 
    <input type="submit" value="Register" id="btnRegister" /> 
} 

сделать ваше сообщение действие принимают 2 класса

public ActionResult Register(RegisterModel RegisterInfo, NameModel NameInfo) 
+0

Спасибо @DaveA, In @ Html.Partial («NameModel» ", @ Model.Name.NameInfo)." Имя "не имеет NameInfo.I изменил его на @ Html.Partial (" NameModel ", @ Model.Name), но он обрывается с ошибкой ссылки объекта в том же месте. – user2232861

+0

@ user2232861, см. Мое редактирование. Я хотел назвать родительский класс SuperModel. Что еще более важно, добавьте метод действий, в котором вы создаете экземпляры своих классов и передаете их в свой вид. –

+0

Я пробовал @Html.Действие («MyNamePartialView»), а затем мой метод действия - public ActionResult MyNamePartialView() { return PartialView («MyNamePartial», новый NameModel()); } он загружается нормально, но когда я отправляю форму после заполнения, он связывает только класс Register с значениями формы, но класс Name равен null. – user2232861

Смежные вопросы