2017-08-31 113 views
-1

私はASP.NET MVCの初心者です。私はちょうどうまく動作する私のログインページを作成することから始めたが、ユーザーが間違った資格情報を入力したときに問題がある。これは私がやっていることです:ASP.NET MVC:ModelStateエラーメッセージが表示されない

のUserProfile

public partial class UserProfile 
    { 
     public int UserId { get; set; } 
     [Display(Name = "User name")] 
     [Required(ErrorMessage = "Username is required.")] 
     public string UserName { get; set; } 
     [Display(Name = "Password")] 
     [DataType(DataType.Password)] 
     [Required(ErrorMessage = "Password is required.")] 
     public string Password { get; set; } 
     public bool IsActive { get; set; } 
    } 

にHomeController:

public class HomeController : Controller 
{ 
    public ActionResult Login() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(UserProfile objUser) 
    { 
     if (ModelState.IsValid) 
     { 
      using (DB_Entities db = new DB_Entities()) 
      { 
       var obj = db.UserProfiles.Where(a => a.UserName.Equals(objUser.UserName) && a.Password.Equals(objUser.Password)).FirstOrDefault(); 
       if (obj != null) 
       { 
        Session["UserID"] = obj.UserId.ToString(); 
        Session["UserName"] = obj.UserName.ToString(); 
        return RedirectToAction("UserDashBoard"); 
       } 
      } 
     } 
     else 
     { 
      ModelState.AddModelError("", "Invalid Credentials"); 
     } 
     return View(objUser); 
    } 

    public ActionResult UserDashBoard() 
    { 
     if (Session["UserID"] != null) 
     { 
      return View(); 
     } 
     else 
     { 
      return RedirectToAction("Login"); 
     } 
    } 
} 

そしてビュー

@model MyWebApplication.Models.UserProfile 

@{ 
    ViewBag.Title = "Login"; 
} 

@using (Html.BeginForm("Login", "Home", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Login" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 


@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

データベースに格納されていないユーザー名をユーザーが入力すると、「無効な資格情報」というメッセージが表示されない理由がわかりません。

+0

資格情報が無効な場合、プログラムのフローによってモデル状態のエラーが設定されないため、表示されません。 'ModelState.IsValid'がfalseの場合にのみ、エラーを設定します。本当の場合は、ユーザーを認証していますが、無効な場合はエラーを返しません。 –

+0

パスワードを平文のデータベース(ハッシュ(塩))としてデータベースに保存することは決してありません。そして、私はあなたの仕事を[セキュリティ、認証と承認](https://www.asp.net/mvc/overview/security) –

答えて

1

ifの文に、ModelState.AddModelError("", "Invalid Credentials");という行がヒットしているかどうかはわかりませんが、それは疑いありません。

ifの文が正しく構築されていないため、ModelStateが有効でない場合はInvalid Credentialsエラーを表示するだけです。ユーザーの資格情報が存在しないかどうかは関係ありません。

はつまり、あなたのif文これに書き換える必要があります。

if (ModelState.IsValid) 
{ 
    using (DB_Entities db = new DB_Entities()) 
    { 
     var obj = db.UserProfiles.Where(a => a.UserName.Equals(objUser.UserName) && a.Password.Equals(objUser.Password)).FirstOrDefault(); 
     if (obj != null) 
     { 
      Session["UserID"] = obj.UserId.ToString(); 
      Session["UserName"] = obj.UserName.ToString(); 
      return RedirectToAction("UserDashBoard"); 
     }  
     else 
     { 
      ModelState.AddModelError("", "Invalid Credentials"); 
     } 
    } 
} 

好き嫌いではないと、うまくいけば、あなたのUserNameプロパティは、ユニークあるので、あなたはまったく同じUserNameを持つ2人のユーザーを持っている場合Passwordと表示され、FirstOrDefaultが発生すると、ユーザーが別の資格情報でサインインする可能性があります。だから私はUserNameプロパティが一意であることを確認し、FirstOrDefaultSingleOrDefaultに変更します。

しかし、それがない場合は、ここで変更する必要があるものです:

オプション1

エラーメッセージがあなたのコントローラの変更で、その後テキストボックスの下に表示させたい場合は、この:

ModelState.AddModelError("", "Invalid Credentials"); 

へ:

ModelState.AddModelError("UserName", "Invalid Credentials"); 

AddModelErrorは、そのキーに対してkeyerrorMessageの2つのパラメータをとります。 keyは、モデルのプロパティ名です。

public void AddModelError(
    string key, 
    string errorMessage 
) 

オプション2

あなたがテキストボックスの下ではなく、フォームの上部にエラーメッセージを表示したくない場合は、次の

その後、この変更:

@Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

To:

@Html.ValidationSummary(false, "", new { @class = "text-danger" }) 

オプション2では、オーバーロードされたメソッドを注意深く読み取る必要があります。あなたはValidationSummaryセットアップを持っているかとの相関でMSDN ...最初のパラメータはbool excludePropertyErrorsあるパー..あなたは真にそのセットを持っていたので、あなたは、私がにそれを変更することが提案されている理由ですプロパティのエラーを除くましたプロパティのエラーはとなり、となります。

public static MvcHtmlString ValidationSummary(
    this HtmlHelper htmlHelper, 
    bool excludePropertyErrors, 
    string message, 
    IDictionary<string, object> htmlAttributes 
) 

これが役立つかどうかを教えてください。

+1

非常にありがとう!出来た。非常に参考になる説明。はい、ユーザー名は一意ですので、SingleOrDefaultに変更しました。ありがとうございました! – ukama

関連する問題