2016-11-13 4 views
0

私は、UIにデータ検証を追加するためのベストプラクティスに従っています。 ViewModelにデータ検証を追加し、そのデータが有効な場合は、コントローラにフォームを送信します。ただし、コントローラが受信するデータは常にNULL値です。私が間違っていることは何か考えていますか? MVVC全体のアーキテクチャは私を混乱させています。私はモデルを使用してフォームを送信していましたが、モデルでデータ検証を取得できませんでした。ViewModelデータは、コントローラに渡されるとすべてnullですか?

コントローラー:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> CreateResource(AddResourceViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       await (//does something); 
      } 
      return View(); 
     } 

のModelView:CSHTMLフォームの

public class AddResourceViewModel 
{ 

     public string User { get; set; }  
     public string ResourceName { get; set; } 
     public int ResourceId { get; set; } 
     public string Model { get; set; } 
     public float Latitude { get; set; } 
     public float Longitude { get; set; } 
     public decimal Amount { get; set; } 
     public int UnitId { get; set; } 
     public int PrimaryEsfId { get; set; } 
     public IEnumerable<string> Capabilities { get; set; } 
     public IEnumerable<int> AdditionalEsfs { get; set; } 

     public Resource Resource { get; set; } 


} 

ビギニング:

@model erms.ViewModel.AddResourceViewModel 
<form asp-controller="AddResource" asp-action="NewResource" method="post" class="form-horizontal"> 
<div class="panel panel-default"> 
    <div class="panel-body"> 
     <form asp-controller="AddResource" asp-action="CreateResource" method="post" class="form-horizontal"> 

      <div asp-validation-summary="All" class="text-danger"></div> 
      <div class="form-group"> 
       <label asp-for="ResourceId" class="col-md-2 control-label">Resource ID:</label> 
       <div class="col-md-10"> 
        <input asp-for="ResourceId" class="form-control" value="@Model.Resource.ResourceId" readonly /> 
        <span asp-validation-for="ResourceId" class="text-danger"></span> 
       </div> 
      </div> 
+0

'HttpPost'属性でコントローラのアクションを飾っていますか?フォームをサーバーにポストしているのですか、GETリクエストを通じて厳密にこれを実行していますか? –

+0

ええ、申し訳ありませんが、私は例から外しました。私は元の投稿を編集しました。 – vercingortix

答えて

1

このような種類のものは、新しいアーキテクチャを学ぶときにとても不満に思っていますが、わかりました。これは命名規則上の問題です。私はこの問題に対処してきたし、それが正しく動作するようになりました:

競合する名前があった。私のコントローラから

public async Task<IActionResult> NewResource(AddResourceViewModel model) 

:私のViewModelから

public string Model { get; set; } 

、と。だから、モデルモデルと競合して...

によると:http://ideasof.andersaberg.com/development/aspnet-mvc-4-model-binding-null-on-post

アクションであなたの着信変数を使用すると、掲載されているモデルで行うのと同じ名前を付けないでください。それはモデルバインダーを台無しにするでしょう。

0

はおそらく、私は問題はあなたにカミソリを使用していないだろうと思っていますフォームを提出してください。これは私が念頭に置いていることです:

@model <AddResourceViewModel> 

@using(Html.BeginForm()) { 

<div asp-validation-summary="All" class="text-danger"></div> 
     <div class="form-group"> 
      <label asp-for="ResourceId" class="col-md-2 control-label">Resource ID:</label> 
      <div class="col-md-10"> 
       @Html.TextboxFor(x => x.ResourceId) 
       @Html.ValidationMessageFor(x => x.ResourceId) 
      </div> 
     </div> 
} 

私は通常私のフォームを検証するために使用しているので、これはおそらく考慮する価値があります。私は間違っているかもしれません。

+0

タグヘルパーのcshtmlにフォームコントローラサブミッションを追加しました。私は、これは.NET Coreを使用しているので、TagHelpersはHtmlヘルパーの代わりに使用されているはずです: https://dannyvanderkraan.wordpress.com/2016/04/19/asp-net-core-1-0-goodbye-html -helpers-hello-taghelpers/ – vercingortix

2

return View();からreturn View(model);を置き換えます。

+0

私はこれもやっていましたが、それは助けになりましたが、それはまだ命名規則の問題でした。ありがとうございました。 – vercingortix

関連する問題