一个视图与“复合”视图

时间:2009-06-05 07:37:37

标签: asp.net-mvc

我怀疑如何构建我的视图和视图模型......让我们看一下(简化)情况。我有一个注册视图,有两个变体:openid和strandard用户名/密码。我看到了两种方法

实现这个:

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") %>
...

我认为第一种方式不是OO,但是对齐视图很容易,第二种方式更多,但很难对齐元素 - 这就是为什么我没有放电子邮件进入用户控件,因为我想在帐户信息附近收到电子邮件。

您会选择什么选项?为什么?也许是第三种选择?这两个选项之间的限制在哪里(当您选择第一个,第二个时)...

非常感谢!

2 个答案:

答案 0 :(得分:1)

我使用第二个选项:

  • 我可以将ascx用于其他观点
  • 如果我 使用Ajax我可以加载一个ascx 如果javascript是异步的 如果没有,则启用或加载整页。 这使得实施起来更容易 两者:Ajax和非Ajax版本

我只会将所需的模型传递给ascx:

   

如果我真的将公共字段放在主视图上,我就不是真的。最好能够将ascx放在其他视图上,并拥有所需的所有字段。

我们大多数人来自WebForm - ascx非常强大的世界。这是我在评估MVC时首先看到的。好吧,没什么好看的。

但即使在这种非常有限的形式下,它们也很有用。

答案 1 :(得分:0)

我更喜欢第一个选项,因为您的情况不够复杂,无法切换到第二个选项。在更复杂的情况下(例如,注册逻辑对于不同类别的用户而言完全不同)我更喜欢第二种选择。我认为您需要做出更多努力来正确测试第二个解决方案(正如您所说:几个视图模型和多个视图/用户控件)。