2017-09-07 21 views
0

私は以下のMVCビューとコントローラを持っています。私がフォームを提出するとき。 ChangeUserViewModelではなくIdで渡されます。MVCフォームがサブミット時にモデルを渡しません

ビュー:

@model AppTransactionsManagement.Models.ChangeUserViewModel 
<div> 
    <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
     <h4 class="modal-title" id="myModalLabel">Change Password</h4> 
    </div> 

    @using (Html.BeginForm("ChangePassword", "UsersAdmin", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 

     <div class="modal-body"> 
      <div class="form-horizontal"> 
       @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
       @Html.HiddenFor(model => model.Id) 

       <div class="form-group"> 
        @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-10"> 
         @Html.TextBoxFor(model => model.Email, new { @class = "form-control" }) 
         @Html.ValidationMessageFor(model => model.Email, "", 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> 
     </div> 
     <div class="modal-footer"> 
      <div class="form-group"> 
       <div class="col-md-offset-2 col-md-10"> 
        <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button> 
        <input type="submit" value="Save" class="btn btn-primary" /> 
       </div> 
      </div> 
     </div> 

    } 
</div> 

コントローラー:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     private async Task<ActionResult> ChangePassword(ChangeUserViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       //Get the user manager and user. (if the user is not found, user will be null) 
       ApplicationUser user = await UserManager.FindByIdAsync(model.Id); 


       if (user == null) 
       { 
        return PartialView("_ChangePassword"); 
       } 
       else 
       { 

        user.PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password); 

        UserManager.UpdateSecurityStamp(user.Id.ToString()); 
        //Save Changes 
        IdentityResult result = await UserManager.UpdateAsync(user); 

        if (result.Succeeded) 
        { 
         return Json(new { success = true }); 
        } 
        else 
        { 
         var error = result.Errors.FirstOrDefault(); 
         return PartialView("_ChangePassword"); 

        } 
       } 
      } 
      return PartialView("_ChangePassword"); 

     } 

モデル:私はDOIだ何

public class ChangeUserViewModel 
    { 
     public string Id { get; set; } 

     [Required(AllowEmptyStrings = false)] 
     [Display(Name = "Email")] 
     [EmailAddress] 
     public string Email { get; set; } 

     [Required] 
     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 
    } 

間違っている?

+0

ChangeUserViewModelを表示できますか? – Win

+0

「代わりに」とはどういう意味ですか、あなたのモデルはIDフィールドだけが入力されて空白になっていますか?あなたのモデルをどうやって置き換えることができるのか分かりません。これが起こっているとあなたはどのように判断していますか? – mxmissile

+0

あなたのビューモデルを投稿すると、通常の原因は、渡しているモデルにフィールドがなく、フレームワークが予想しているオブジェクトに渡されるものをマッピングする際に問題がある場合です。 –

答えて

3

このメソッドにはprivateとマークされています。アクセスできない可能性があります。プライベートメソッドにPOSTを割り当てることはできません。これはおそらくあなたの問題です。

[HttpPost] 
public async Task<ActionResult> ChangePassword(ChangeUserViewModel model) 
{ 
    ...... 
    ...... 
} 
+0

OPの「EditorFor」設定が正しい方法です。彼らがあなたが提案したものに変更された場合、 'form-control 'クラスは適用されません。 –

+0

@T_Royそうです、私は 'TextBoxFor'を考えていました。ありがとう。 – adiga

+0

あなたは男性@adigaです。私は3時間それをしてきました、そして、私は一度アクセス修飾子を見ることを決して考えませんでした。最終的に私はそれを見つけるだろうが、神はどのくらいの時間がかかるのかしか知りません。あなたは時間を節約します。ありがとう、ありがとう... – zAnthony

0

コントローラアクションでモデルバインドを使用してみてください。

public async Task<ActionResult> ChangePassword([Bind(Include = "Id, Email, Password")]ChangeUserViewModel model) {} 
+0

あなたも正しいです。 – zAnthony

関連する問題