Я сомневаюсь, как сконструировать мои представления и модели представлений ... Давайте рассмотрим (упрощенную) ситуацию. У меня есть вид регистрации с двумя вариантами: openid и стандартное имя пользователя / пароль. Я вижу два способа, как
реализовать это:
1.) Первый способ: модель одного вида и один вид (некоторый псевдокод):
class RegisterViewModel:
- public string OpenId {get;set;} // used only in openid registration
- public string Username {get;set;} // used only in username/password registration
- public string Password {get;set;} // used only in username/password registration
- public string PasswordConfirmation {get;set;} // used only in username/password registration
- public string Email {get;set;} // used in both registrations
- public string FirstName {get;set;} // used in both registrations
- public string LastName {get;set;} // used in both registrations
- public RegistrationType Type {get;set;} // used in both registrations
...
RegisterView.aspx (System.Web.Mvc.ViewPage):
...
<h1>Account info</h1>
<% if (Model.Type == Registration.Type.OpenId) { %>
<%= Html.TextBox("OpenId") %>
<% } else { %>
<%= Html.TextBox("Username") %>
<%= Html.TextBox("Password") %>
<%= Html.TextBox("PasswordConfirmation") %>
<% } %>
<%= Html.TextBox("Email") %>
<h1>Personal info</h1>
<%= Html.TextBox("FirstName") %>
<%= Html.TextBox("LastName") %>
..
2.) Второй способ: несколько моделей представлений и несколько представлений (пользовательские элементы управления):
abstract class RegisterViewModel:
- public string Email {get;set;}
- public string FirstName {get;set;}
- public string LastName {get;set;}
class OpenIdRegisterViewModel:
- public string OpenId {get;set;}
class UsernameRegisterViewModel:
- public string Username {get;set;}
- public string Password {get;set;}
- public string PasswordConfirmation {get;set;}
UserControl.ascx:
...
<h1>Personal info</h1>
<%= Html.TextBox("FirstName")
<%= Html.TextBox("LastName")
...
OpenIdRegisterView.aspx (System.Web.Mvc.ViewPage):
...
<h1>Account info</h1>
<%= Html.TextBox("OpenId") %>
<%= Html.TextBox("Email") %>
<% Html.RenderPartial("UserControl") %>
..
UsernameRegisterView.aspx (System.Web.Mvc.ViewPage):
...
<h1>Account info</h1>
<%= Html.TextBox("Username") %>
<%= Html.TextBox("Password") %>
<%= Html.TextBox("PasswordConfirmation") %>
<%= Html.TextBox("Email") %>
<% Html.RenderPartial("UserControl") %>
...
Я думаю, что первый способ не так хорош, но легче выровнять вид, а второй - больше, но сложно выровнять элементы - вот почему я не помещал электронную почту в пользовательский контроль, потому что я хочу, чтобы электронная почта рядом с информацией учетной записи.
Какой вариант вы бы выбрали и почему? Может какой-то третий вариант? Где находится предел между этими двумя вариантами (когда вы выбираете первый, когда второй) ...
Большое спасибо!