Один взгляд против "составных" взглядов - PullRequest
1 голос
/ 05 июня 2009

Я сомневаюсь, как сконструировать мои представления и модели представлений ... Давайте рассмотрим (упрощенную) ситуацию. У меня есть вид регистрации с двумя вариантами: 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") %>
...

Я думаю, что первый способ не так хорош, но легче выровнять вид, а второй - больше, но сложно выровнять элементы - вот почему я не помещал электронную почту в пользовательский контроль, потому что я хочу, чтобы электронная почта рядом с информацией учетной записи.

Какой вариант вы бы выбрали и почему? Может какой-то третий вариант? Где находится предел между этими двумя вариантами (когда вы выбираете первый, когда второй) ...

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 05 июня 2009

Я использую второй вариант:

  • Я могу использовать ascx для других просмотров
  • Если я использовать Ajax я могу загрузить один ascx асинхронно, если JavaScript включите или загрузите полную страницу, если нет. Это облегчает реализацию обе версии: Ajax и не Ajax

Я бы только передал необходимую модель в ascx:

Я не уверен, если бы я действительно поместил общие поля на главном экране. Было бы лучше просто иметь возможность поместить ascx в другое представление и иметь все необходимые поля.

Большинство из нас происходят из WebForm - мира, в котором ASCX очень мощные. Это было первое, на что я обратил внимание при оценке MVC. Ну, там было не так много, чтобы увидеть.

Но даже в этой очень ограниченной форме они полезны.

0 голосов
/ 05 июня 2009

Я бы предпочел первый вариант , потому что ваша ситуация недостаточно сложна, чтобы переключиться на второй вариант. В случае более сложных ситуаций (например, логика регистрации совершенно различна для разных категорий пользователей), я бы предпочел второй вариант. И я думаю, вам нужно будет приложить больше усилий для правильного тестирования второго решения (как вы сказали: несколько моделей представлений и несколько представлений / пользовательских элементов управления ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...