2016-04-05 2 views
1

Я ударился головой о стену, пытаясь решить эту проблему.ModelState.AddModelError не отображает ошибку в представлении - ASP.NET

У меня есть эта точка зрения контроллера

public class LoginController : Controller 
    { 
     public ActionResult Index(LoginClass model) 
     { 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Login(LoginClass model, string ReturnUrl) 
     { 

      if (!this.ModelState.IsValid) 
      { 
       return this.View(model); 
      } 

      if (ModelState.IsValid) 
      { 
       if (Membership.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
        if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/") 
         && !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\")) 
        { 
         return Redirect(ReturnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect"); 
       } 


      } 

      return RedirectToAction("Index", "Login", model); 

     } 

     public ActionResult Logout() 
     { 
      FormsAuthentication.SignOut(); 

      return RedirectToAction("Index", "Home"); 
     } 

    } 

и вот мое мнение:

<section id="login"> 
    <div class="container"> 
     <form action="~/Login/Login" id="Login" method="post"> 
      <div class="row"> 
       <div class="col-md-12"> 
        <p> 
         <label for="username">Username</label> 
         <input type="text" id="username" name="username" class="form-control" /> 
        </p> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-md-12"> 
        <p> 
         <label for="password">Password</label> 
         <input type="password" id="password" name="password" class="form-control" /> 
        </p> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-md-12"> 
        <p> 
         <input type="submit" id="submit" name="submit" value="Login" class="btn btn-default" /> 
        </p> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-md-12"> 
        <p> 
         <label for="password">Remember Me?</label> 
         <input type="checkbox" id="chkPersist" name="chkPersist" /> 
        </p> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-md-12"> 
        <p> 
         @Html.ValidationSummary() 
        </p> 
       </div> 
      </div> 
     </form> 
    </div> 
</section> 

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

+0

, что происходит, когда вы делаете @ Html.ValidationSummary (ложь) – cableload

+0

тот же результат, не появляется сообщение об ошибке – user979331

ответ

1

Проблема заключается с последняя строка в вашем методе Login. Вы вызываете RedirectToAction вместо View. Это приводит к тому, что вы теряете все свое специфическое состояние, включая состояние модели и ошибки проверки, которые вы создали в своем действии Login. Вы можете изменить свой метод Login так (я немного упростил его), на самом деле единственное изменение заменяет RedirectToAction("Index", "Login", model) с View(model) на последней строке.

Если вы хотите перенаправить в случае сбоя аутентификации, и вы хотели использовать RedirectToAction, то см. Мой другой ответ. Я отправил here.

[HttpPost] 
public ActionResult Login(LoginClass model, string ReturnUrl) 
{ 
    if (!this.ModelState.IsValid) 
     return this.View(model); 

    if (Membership.ValidateUser(model.UserName, model.Password)) 
    { 
     FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

     if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/") 
      && !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\")) 
     { 
      return Redirect(ReturnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 
    ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect"); 
    return this.View(model); // return to the same view to show your error message 

    // return RedirectToAction("Index", "Login", model); // do not redirect 
} 
1

Чтобы отобразить сообщение, вам нужно добавить заполнитель с помощью функции Html Helper.

<div>@Html.ValidationMesssage("KeyName")</div> 

на ваше мнение, чтобы вы могли отобразить сообщение проверки.

ИМЯКЛАВИШИ приходит от контроллера

ModelState.AddModelError("KeyName", "The user name or password provided is incorrect"); 

Также может потребоваться для обеспечения проверки на стороне клиента включена в вашем файле web.config. (Обычно они)

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 
+0

Это не сработало, сообщение об ошибке – user979331

+0

, что происходит, когда вы делаете @ Html.ValidationSummary (ложь) – cableload

+0

же result ... nothing – user979331

Смежные вопросы