2017-01-05 9 views
0

ユーザーがログインすると、通常はパスワードを戻さないようにします。私はMVC 5でこれを試しているし、それを実現させることはできません。私はModelState.Clear()と同様にmodel.PASSWORD = ""を試しましたが、データはまだ表示されています。ModelStateはクリアされていますが、データはまだ表示されます

コントローラー:

public async Task<ActionResult> Login(Login model) { 
    if(ModelState.IsValid) { 
     User temp = await db.Users.Where(u => u.USERNAME == model.USERNAME).FirstOrDefaultAsync(); 
     if(temp != null) { 
      try { 
       if(Password.VerifyPass(model.PASSWORD, temp.PASSWORD)) { 
        LoginUser(temp); 
        return RedirectToAction("Index", "EMR"); 
       } 
      } catch { } 
     } 
    } 
    ModelState.Clear(); 
    model.PASSWORD = ""; 
    ModelState.AddModelError("", "Username/password is unknown, or model was invalid!"); 
    return View(); 
} 

モデル:

public class Login { 

     [Display(Name = "Username")] 
     public string USERNAME { get; set; } 

     [Display(Name = "Password")] 
     public string PASSWORD { get; set; } 
    } 
} 

ビュー:にModelState変数とVisualStudioをデバッグモードでモデル変数の両方を見ていたら

@using(Html.BeginForm()) { 
    @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", @type = "password" } }) 
       @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-success" /> 
      </div> 
     </div> 
    </div> 
} 

、彼らは両方ショーデータは""となります。おそらく何が原因でしょうか?

+1

ビューコードはどのように見えますか?ビューモデルはどのように見えますか? – Shyju

+0

私はそこに何か不足していました。編集 –

+0

おそらく私は何かが明らかではないが、あなたが@ Html.EditorFor()を@ Html.PasswordFor()で使用している理由は何ですか? –

答えて

1

は、一つの可能​​な解決策は、単に@ Html.PasswordFor()を使用することです。これはパスワード入力に対して意味的に正しい入力をレンダリングします。これは暗黙のうちにブラウザが自動入力しないことを暗示します。だから、代わりに@ Html.EditorForの、これを試してみてください。

@Html.PasswordFor(model => model.PASSWORD, new { htmlAttributes = new { @class = "form-control" }) 
1

をクリアした後でモデルを表示することはできません。

return View(model); 

まだ以下のように試してみてください。

var newModel = new Login { Password = "" }; 
ModelState.Clear(); 
return View(newModel); 
+0

このページでは、前に入力したパスワードが表示され、どちらの候補も表示されます。 –

+0

@CalebHuggins入力フィールドの値を記憶し、入力するブラウザのようです。 –

+0

そして今、これらのすべてを試した後、これが働く唯一のものです。私はゼロから再起動し、すべてを書き直す必要があるかもしれません。 –

1

私はそれはそれのように見える

return View(model); 
+0

'[HttpGet]'や '[HttpPost]'だけ、あるいはその両方ですか? –

+0

ちょうど '[HttpPost]' – Kevorkian

0

@CalebHugginsに加えて

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] 

とその原因、ブラウザのキャッシングに、注釈を付けるログインアクションがrememberignされるブラウザだと思いますフィールド値を入力して値を入力します。これを避けるには、テキストボックスのオートコンプリート属性を「オフ」に設定してみてください。

モデルバインドされたテキストボックスは、次のように表示されます。

@Html.TextBoxFor(x => x.Something, new { autocomplete="off" }) 

Thnaksとみなし、 チェタンRanpariya私はコメントしていたとして

1

まずPasswordデータ型を使用してパスワードフィールドを飾ります。

public class Login 
{  
     [Display(Name = "Username")] 
     public string USERNAME { get; set; } 

     [Display(Name = "Password")] 
     [DataType(DataType.Password)] 
     public string PASSWORD { get; set; }   
} 

そして、ビューでは、PasswordForヘルパーメソッドを使用します。

@Html.PasswordFor(x=>x.PASSWORD) 

これにより、パスワードフィールドを空の文字列に明示的に設定する必要はありません。 MVCがそれを行います。

関連する問題