4 Stimmen

Asp.NET MVC Model Binding - Verwendung von Bind Parameter Attribute, um ein Präfix für einen einfachen Typ zuweisen

Ich habe eine .net mvc app mit einer Controller-Aktion, die Benutzer-Registrierung Beiträge akzeptiert. Ich habe die folgenden UI-Felder: emailaddress, firstname, lastname, password und confirmpassword. Einige dieser Felder gehören nicht zu einem Modellobjekt (z.B. gehört confirm password nicht zum Benutzermodell, nur password). Mein Registrierungsformular befindet sich in der gleichen Ansicht wie das Anmeldeformular. Ich habe also zwei unabhängige Formulare in derselben Ansicht, die jeweils auf verschiedene Aktionen verweisen.

Ich dachte, ich könnte den Formularelementen Präfixe zuweisen, um die gleichen Felder zwischen Registrierung und Anmeldung zu trennen. Das Problem, das ich hatte, war bei der Validierung, wenn ein Fehler auftrat, wurde die Ansicht neu geladen, eine Validierungsmeldung wurde angezeigt, aber Felder wie E-Mail (die in Login und Register vorhanden sind) würden beide mit der zuvor eingegebenen Adresse ausgefüllt werden. Zusätzlich hatte ich eine Validierungsübersicht über den Feldern login und register. Wenn bei der Registrierung ein Fehler auftrat, wurden beide Überprüfungszusammenfassungen mit den Fehlermeldungen aufgefüllt. Ich dachte mir, dass die Zuweisung von Präfixen zu den Feldern (register.fieldname und login.fieldname) diese Probleme lösen könnte.

Wenn also die Registrierungsaktion den Beitrag verarbeitet, findet sie keine Werte mehr für die Felder des Registrierungsformulars und gibt stattdessen null zurück. Im Folgenden wird die Methodensignatur für diese Aktion verwendet...

Jeder Hinweis darauf, was hier vor sich geht, wäre großartig.

Danke Jeremy

 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)

und das folgende ist von meinem ui, es stellt das Anmeldeformular....

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

Können Sie den Rest von Register() zeigen? (Zumindest die Teile, die das Modell vor der Rückkehr auffüllen).

0 Stimmen

Die Registrierungsfunktionalität ist auf einige zusätzliche Klassen verteilt. In der einfachsten Erklärung erstelle ich ein neues Konto und ein neues Benutzerobjekt mit den vom Formular übergebenen Werten. Dann aktualisiere ich mein Modell mit LINQ.

5voto

user31934 Punkte 281

Ich denke, um [Bind] mit einem Präfix zu verwenden, müssen Sie einen komplexen Typ verwenden. Sie assoziieren das gleiche Präfix mit jedem Parameter, die nicht mit der Art und Weise funktioniert, dass das MVC-Framework es tut.

Sie können einen Typ erstellen, der das Formular Post bearbeitet:

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

Dann können Sie Ihre Unterschrift ändern in:

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

0 Stimmen

Das ist schon ziemlich ätzend. Warum sollte ich an einen komplexen Typ binden müssen, wenn ich nur, sagen wir, 3 Eigenschaften brauche? Das scheint ein schrecklicher Mangel zu sein.

1voto

Tom Lint Punkte 463

Es scheint, dass für einfache Typen wie int und string, das Bind-Präfix den Modellnamen für die Parameter überschreibt. Wenn Sie Ihre Aktionsmethode als Beispiel verwenden, würde der DefaultModelBinder für alle Parameter nach dem Namen "Register" suchen.

Um dies zu umgehen und keinen komplexen Typ zu benötigen, müssen Sie den voll qualifizierten Namen so angeben, wie Mvc ihn im HTML-Markup darstellen würde.

Wenn Sie dies auf Ihre Aktionsmethode anwenden, sollte sie wie folgt aussehen:

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X