我怀疑如何构建我的视图和视图模型......让我们看一下(简化)情况。我有一个注册视图,有两个变体: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,但是对齐视图很容易,第二种方式更多,但很难对齐元素 - 这就是为什么我没有放电子邮件进入用户控件,因为我想在帐户信息附近收到电子邮件。
您会选择什么选项?为什么?也许是第三种选择?这两个选项之间的限制在哪里(当您选择第一个,第二个时)...
非常感谢!
答案 0 :(得分:1)
我使用第二个选项:
我只会将所需的模型传递给ascx:
如果我真的将公共字段放在主视图上,我就不是真的。最好能够将ascx放在其他视图上,并拥有所需的所有字段。
我们大多数人来自WebForm - ascx非常强大的世界。这是我在评估MVC时首先看到的。好吧,没什么好看的。
但即使在这种非常有限的形式下,它们也很有用。
答案 1 :(得分:0)
我更喜欢第一个选项,因为您的情况不够复杂,无法切换到第二个选项。在更复杂的情况下(例如,注册逻辑对于不同类别的用户而言完全不同)我更喜欢第二种选择。我认为您需要做出更多努力来正确测试第二个解决方案(正如您所说:几个视图模型和多个视图/用户控件)。