Привязка модели Asp.NET MVC - использование атрибута параметра привязки для назначения префикса для простого типа

У меня есть приложение .net mvc с действием контроллера, которое принимает сообщения о регистрации пользователей. У меня есть следующие поля пользовательского интерфейса: адрес электронной почты, имя, фамилия, пароль и подтверждающий пароль. Некоторые из этих полей не принадлежат объекту модели (т.е. пароль подтверждения не принадлежит модели пользователя, только пароль). Моя регистрационная форма находится в том же виде, что и форма входа. Поэтому мне нужно создавать независимые формы в одном и том же представлении, каждая из которых отправляет сообщения в разные действия.

Я решил, что могу назначить префиксы элементам формы, чтобы разделить подобные поля между регистром и логином. Проблема, с которой я столкнулся, заключалась в проверке, если произошла ошибка, представление было повторно загружено, было показано сообщение проверки, но поля, такие как электронная почта (которые существуют в логине и регистрации), будут заполнены ранее введенным адресом. Кроме того, у меня была сводка проверки над полями входа и регистрации. Если во время регистрации произошла ошибка, обе сводки проверки были заполнены сообщениями об ошибках. Я полагал, что назначение префиксов полям (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)

и следующее из моего пользовательского интерфейса, оно представляет собой регистрационную форму ....

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

Ответов (2)

Кажется, что для простых типов, таких как int и string, префикс привязки переопределяет имя модели для параметров. Используя ваш метод действия в качестве примера, DefaultModelBinder будет искать имя «Регистрация» для всех параметров.

Чтобы обойти это и не требовать сложного типа, вам необходимо указать полное имя, так как 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)

Я думаю, чтобы использовать [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) {
...
}