2009-02-26 2 views
4

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

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

Вы можете показать остальную часть регистра()? (По крайней мере, биты, которые заполняют модель перед возвратом.) –

+0

Функциональность регистрации распространяется на некоторые дополнительные классы. В простейшем объяснении я создаю новую учетную запись и пользовательский объект, используя значения, переданные формой. Затем я обновляю свою модель с помощью LINQ. – Jeremy

ответ

6

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

Такой отстой. Почему мне нужно привязываться к сложному типу, если все, что мне нужно, это, скажем, 3 свойства? Кажется, это ужасный недостаток. –

0

кажется, что для простых типов, таких как Int и строки, Привязать Префикс переопределяет имя модели для параметров. Используя метод действия в качестве примера, 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) 
Смежные вопросы