4

我有一个带有控制器操作的 .net mvc 应用程序,它接受用户注册帖子。我有以下 UI 字段:电子邮件地址、名字、姓氏、密码和确认密码。其中一些字段不属于模型对象(即确认密码不属于用户模型,只有密码)。我的注册表单与登录表单位于同一视图中。所以我必须在同一个视图上独立表单,每个回帖返回不同的操作。

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

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

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

谢谢杰里米

 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>
4

2 回答 2

5

我认为为了使用带前缀的 [Bind],您需要使用复杂类型。您将相同的前缀与每个参数相关联,这不适用于 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) {
...
}
于 2009-04-11T17:32:56.363 回答
1

似乎对于像 int 和 string 这样的简单类型,Bind Prefix 会覆盖参数的模型名称。以您的操作方法为例,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)
于 2016-08-16T09:40:41.967 回答