Связывание модели Asp.NET MVC - Использование атрибута параметра Bind для назначения префикса для простого типа - PullRequest
4 голосов
/ 27 февраля 2009

У меня есть приложение .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)

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

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

6 голосов
/ 11 апреля 2009

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

Кажется, что для простых типов, таких как 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)
...