2010-07-20 32 views
0

J'apprends asp.net mvc 2 et la validation courante. Ma configuration est affichée après le texte ici. Mon problème est que je ne sais pas comment définir les erreurs contenues dans l'objet res sur la page d'affichage d'une manière agréable. Comment cela devrait-il être fait? Comme c'est le cas maintenant, aucune erreur n'est affichée sur la vue, mais la validation fonctionne plutôt bien. Je suppose que je dois insérer un code où j'ai écrit "// Définir les erreurs sur la vue" dans le code. Mais quel code dois-je mettre? Je n'étais pas vraiment capable de trouver des réponses claires à cela - peut-être que je suis juste aveugle. J'attends votre aide avec impatience. Je vous remercie.Comment afficher les erreurs dans la vue d'un résultat de validation automatique dans une application asp.net mvc 2?

Mon contrôleur:

public class AccountController 
{ 
    public ActionResult LogOn() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult LogOn(LogOnModel1 model, string returnUrl) 
    { 
     public class LogOnModel1 
     { 
      public string UserName { get; set; } 
      public string Password { get; set; } 
      public bool RememberMe { get; set; } 
     } 

     public class AccountValidator : AbstractValidator<LogOnModel1> 
     { 
      public AccountValidator() 
      { 
       RuleFor(x => x.UserName).NotNull().WithMessage("Brugernavn skal udfyldes").NotEmpty().WithMessage("Brugernavn skal udfyldes"); 
       RuleFor(x => x.Password).NotNull().WithMessage("Kodeord skal udfyldes").NotEmpty().WithMessage("Kodeord skal udfyldes"); 
       Custom(x => { return Membership.Provider.ValidateUser(x.UserName,x.Password) ? new ValidationFailure(null, "wrong password") : null; }); 
      } 
     } 

     FluentValidation.Results.ValidationResult res = new Models.AccountValidator().Validate(model); 
     if (res.IsValid) 
     { 
      FormsService.SignIn(model.UserName, model.RememberMe); 
      if (!String.IsNullOrEmpty(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 
      else 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
     } 
     else 
     { 
      // Set errors on view 
     } 
     return View(model); 
    } 
} 

Mon modèle et classe de validation:

public class LogOnModel1 
{ 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public bool RememberMe { get; set; } 
} 

public class AccountValidator : AbstractValidator<LogOnModel1> 
{ 
    public AccountValidator() 
    { 
     RuleFor(x => x.UserName).NotNull().WithMessage("Brugernavn skal udfyldes").NotEmpty().WithMessage("Brugernavn skal udfyldes"); 
     RuleFor(x => x.Password).NotNull().WithMessage("Kodeord skal udfyldes").NotEmpty().WithMessage("Kodeord skal udfyldes"); 
     Custom(x => { return Membership.Provider.ValidateUser(x.UserName,x.Password) ? new ValidationFailure(null, "wrong password") : null; }); 
    } 
} 

et enfin mon avis:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TelCountMVC.Models.LogOnModel1>" %> 

<asp:Content ID="loginTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Log On 
</asp:Content> 

<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Log On</h2> 
    <p> 
     Please enter your username and password. <%: Html.ActionLink("Register", "Register") %> if you don't have an account. 
    </p> 

    <% using (Html.BeginForm()) { %> 
     <%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 
       <div class="editor-label"> 
        <%: Html.LabelFor(m => m.UserName) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m => m.UserName) %> 
        <%: Html.ValidationMessageFor(m => m.UserName) %> 
       </div> 
       <div class="editor-label"> 
        <%: Html.LabelFor(m => m.Password) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.PasswordFor(m => m.Password) %> 
        <%: Html.ValidationMessageFor(m => m.Password) %> 
       </div> 
       <div class="editor-label"> 
        <%: Html.CheckBoxFor(m => m.RememberMe) %> 
        <%: Html.LabelFor(m => m.RememberMe) %> 
       </div> 
       <p> 
        <input type="submit" value="Log On" /> 
       </p> 
      </fieldset> 
     </div> 
    <% } %> 
</asp:Content> 

Répondre

0

Je pense que vous avez compris cela il y a des siècles.

Vous perdez l'état du modèle si vous appelez RedirectToAction. Vous devez retourner une vue et lui passer le modèle LogOnModel1.

Connectez la vue à votre modèle au lieu de System.Web.Mvc.ViewPage puis dans votre contrôleur faire quelque chose comme ceci:

if(! ModelState.IsValid) { 
    return View("Index", logOnModel1); 
} 

Et here est un lien vers Jeremy Skinner (le créateur de validation Courant) description de la configuration avec MVC 2.