2009-02-26 26 views
4

我有一个.net mvc应用程序,其中包含一个控制器操作,它接受用户注册帖子。 我有以下用户界面字段:emailaddress,名字,姓氏,密码和confirmpassword。其中一些字段不属于模型对象(即,确认密码不属于用户模型,只有密码)。我的注册表格与登录表单位于同一个视图。所以我必须在相同的观点上独立的形式,每个形式发回不同的行动。Asp.NET MVC模型绑定 - 使用绑定参数属性为简单类型分配前缀

我想我可以为表单元素分配前缀以分隔注册和登录之间的相似字段。我遇到的问题是验证,如果发生错误,重新加载视图,显示验证消息,但电子邮件(存在于登录和注册中)等字段都将填入先前输入的地址。另外,我在登录和注册字段上都有一个验证摘要。在注册期间发生错误时,两个验证摘要都会填充错误消息。我想指定字段(register.fieldname和login.fieldname)的前缀可能会帮助解决这些问题。

因此,当注册操作处理帖子时,它不再为注册表单字段找到值,而是返回空值。以下是用于此操作的方法签名...

任何关于这里发生的事情的输入都会很棒。

感谢 杰里米

public ActionResult Register([Bind(Prefix = "Register")] string emailAddress, [Bind(Prefix = "Register")] string firstName, [Bind(Prefix = "Register")] string LastName, [Bind(Prefix = "Register")] string password, [Bind(Prefix = "Register")] string confirmPassword) 

和下面是我的UI,它代表登记表....

<h2>Create a New Account</h2> 
    <p> 
     Use the form below to create a new account. 
    </p> 
    <p> 
     Passwords are required to be a minimum of <%=Html.Encode(ViewData["PasswordLength"])%> characters in length. 
    </p> 
    <%= Html.ValidationSummary() %> 

    <% using (Html.BeginForm("register", "account")) { %> 
    <div> 
     <fieldset> 
     <legend>Account Information</legend> 

     <table> 
      <tr> 
      <td><label for="EmailAddress">Email Address:</label></td> 
      <td> 
       <%= Html.TextBox("Register.EmailAddress") %> 
       <%= Html.ValidationMessage("Register.EmailAddress")%> 
      </td> 
      </tr> 
      <tr> 
      <td><label for="FirstName">First Name</label></td> 
      <td> 
       <%= Html.TextBox("Register.FirstName")%> 
       <%= Html.ValidationMessage("Register.FirstName")%> 
      </td> 
      </tr> 
      <tr> 
      <td><label for="LastName">Last Name</label></td> 
      <td> 
       <%= Html.TextBox("Register.LastName")%> 
       <%= Html.ValidationMessage("Register.LastName")%> 
      </td> 
      </tr>   
      <tr> 
      <td><label for="password">Password:</label></td> 
      <td> 
       <%= Html.Password("Register.password")%> 
       <%= Html.ValidationMessage("Register.password")%> 
      </td> 
      </tr> 
      <tr> 
      <td><label for="confirmPassword">Confirm password:</label></td> 
      <td> 
       <%= Html.Password("Register.confirmPassword")%> 
       <%= Html.ValidationMessage("Register.confirmPassword")%> 
      </td> 
      </tr> 
      <tr> 
      <td colspan="2" class="alignright"> 
       <input type="submit" value="Register" /> 
      </td> 
      </tr> 
     </table> 
     </fieldset> 
    </div> 
    <% } %> 
</div> 
+0

你能告诉注册的其余部分()? (至少在返回之前填充模型的位) – 2009-02-27 13:55:06

+0

注册功能分布在一些其他类中。最简单的解释是,我使用表单传入的值创建一个新的帐户和用户对象。然后我使用LINQ更新我的模型。 – Jeremy 2009-02-27 14:30:55

回答

6

我认为为了使用[绑定]一个前缀,您需要使用复杂类型。您正在将相同的前缀与每个参数相关联,而这与MVC框架的工作方式无关。

您可以创建一个类来处理表单发布:

public class RegistrationForm { 
string EmailAddress {get;set;} 
string FirstName {get;set;} 
string LastName {get;set;} 
string Password {get;set;} 
string ConfirmPassword {get;set;} 
} 

然后你就可以在你的签名改为:

public ActionResult Register(RegistrationForm register) { 
... 
} 
0

看来,简单的类型,如int和string,绑定前缀会覆盖参数的型号名称。以您的操作方法为例,DefaultModelBinder将查找所有参数的名称“Register”。

为了解决此问题并且不需要复杂类型,您需要指定完全限定名称,因为Mvc会将其呈现为HTML标记。

应用给你的操作方法,它应该是这样的:

public ActionResult Register([Bind(Prefix = "Register.EmailAddress")] string emailAddress, [Bind(Prefix = "Register.FirstName")] string firstName, [Bind(Prefix = "Register.LastName")] string LastName, [Bind(Prefix = "Register.Password")] string password, [Bind(Prefix = "Register.onfirmPassword")] string confirmPassword)