2009-02-26 6 views
4

J'ai une application .net mvc avec une action de contrôleur qui accepte les messages d'enregistrement d'utilisateur. J'ai les champs d'interface utilisateur suivants: adresse électronique, prénom, nom, mot de passe et confirmpassword. Certains de ces champs n'appartiennent pas à un objet modèle (c'est-à-dire que le mot de passe de confirmation n'appartient pas au modèle d'utilisateur, mais seulement au mot de passe). Mon formulaire d'inscription se trouve sur la même vue que le formulaire de connexion. J'ai donc des formulaires indépendants sur la même vue, chacun affichant des actions différentes. J'ai pensé que je pouvais assigner des préfixes aux éléments de formulaire pour séparer les champs similaires entre registre et connexion. Le problème que j'avais était sur la validation, si une erreur s'est produite, la vue a été rechargée, un message de validation a été montré mais les champs comme l'email (qui existent dans le login et le registre) seraient tous deux remplis avec l'adresse précédemment entrée. De plus, j'avais un résumé de validation au-dessus des champs de connexion et d'enregistrement. Lorsqu'une erreur s'est produite pendant l'enregistrement, les deux récapitulatifs de validation ont été remplis avec les messages d'erreur. Je pensais assigner des préfixes aux champs (register.fieldname et login.fieldname) pourrait aider ces problèmes. Ainsi, lorsque l'action de registre gère la publication, elle ne trouve plus de valeurs pour les champs du formulaire d'inscription et renvoie à la place une valeur nulle. Ce qui suit est la signature de méthode utilisée pour cette action ...Liaison de modèle Asp.NET MVC - Utilisation de l'attribut de paramètre Bind pour affecter un préfixe à un type simple

Toute contribution sur ce qui se passe ici serait formidable.

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

et ce qui suit est de mon ui, il représente le formulaire d'inscription ....

<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

Pouvez-vous montrer le reste du registre()? (Au moins les bits qui peuplent le modèle avant de revenir.) –

+0

La fonctionnalité d'enregistrement est répartie sur certaines classes supplémentaires. Dans son explication la plus simple, je crée un nouveau compte et un objet utilisateur en utilisant les valeurs transmises par le formulaire. Ensuite, je mets à jour mon modèle en utilisant LINQ. – Jeremy

Répondre

6

Je pense que pour pouvoir utiliser [Bind] avec un préfixe , vous devez utiliser un type complexe. Vous associez le même préfixe à chaque paramètre, ce qui ne fonctionne pas comme le fait le framework MVC.

Vous pouvez créer un type pour gérer la forme post:

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

Ensuite, vous pouvez modifier votre signature à:

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

Ce genre de craint. Pourquoi devrais-je me lier à un type complexe si tout ce dont j'ai besoin est, disons, 3 propriétés? On dirait une lacune terrible. –

0

Il semble que pour les types simples comme int et string, Bind Le préfixe remplace le nom du modèle pour les paramètres. En utilisant votre méthode d'action comme exemple, DefaultModelBinder chercherait le nom "Register" pour tous les paramètres. Pour contourner ce problème et ne pas exiger un type complexe, vous devez spécifier le nom qualifié complet comme Mvc le rendrait dans le balisage HTML.

Appliqué à votre méthode d'action, il devrait ressembler à ceci:

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) 
Questions connexes