2017-11-16 35 views
0

動的なビューを作成しようとしています。ここで、ユーザーが入力する必要があるプロパティのリストを渡すことができます。ASP.Net Core 2.0 MVC動的モデルの更新

プロパティのコレクションは動的なので、特定のプロパティを表示するビューを構築することはできません。

私はプロパティ名とその初期値を表示できました。ユーザーは画面上の値を変更できますが、更新された値はモデルを更新するコントローラーアクションには反映されません。

私は動的モデルと、キーと値のペアのリストを使用しようとしました。

私はオーバーポーズ保護と関係があると考えています。プロパティは動的なので、更新アクションのBind属性でプロパティをリストすることはできません。ここで

は、コントローラのアクションメソッドです:

public IActionResult Test() 
{ 
    dynamic testObj = new ExpandoObject(); 
    testObj.IntProperty = 100; 
    testObj.StringProperty = "A String Value"; 
    return View(testObj); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult Test(ExpandoObject model) 
{ 
    return Ok(); 
} 

ここでは、ビューの:

@model dynamic 

@{ 
    ViewData["Title"] = "Test"; 
} 

<form asp-action="Test" method="post"> 
    <div class="form-horizontal"> 
     @foreach (var propertyName in ((System.Collections.Generic.IDictionary<string, object>)Model).Keys) 
     {   
      <div class="form-group"> 
       <label class="col-md-2 control-label">@propertyName</label> 
       <div class="col-md-10"> 
        @Html.TextBox(propertyName, ((System.Collections.Generic.IDictionary<string, object>)Model)[propertyName]) 
       </div> 
      </div> 
     } 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 

これは新しいアプリケーションであり、そして私は、コードを最初にやっている - ので、モデルが多少変更することができます。本当に必要なのは、更新できるさまざまなプロパティを持つことができることだけです。

ありがとうございます。

答えて

1

IModelBinderは、コントローラとビューの間で渡されるフォームデータが構造的にダイナミックであるため、この目的には特にお勧めできません。より良い、さらに面倒な解決策は、HttpContext.Request.Formからフォームデータを直接取得することです。このタイプには、名前で投稿された値にアクセスできるインデクサーがあります。単一の値(または単一があるだろうと仮定呼ばれる例えば

var name = HttpContext.Request.Form["name"].FirstOrDefault(); 

.FirstOrDefault()(コレクション内の条件を満たしている値以上を求める場合や、SingleOrDefault()が、これは例外をスロー)条件を満たす値) "Name"入力の場合はです。しかし、それらの配列を持っている場合は、foreachループ内で、またはlinqメソッドを使用して、またはインデックスによって直接値を取得できます。例:

var name = HttpContext.Request.Form["name"].FirstOrDefault(x=> x.ToString().StartsWith("x")); 
var name = HttpContext.Request.Form["name"][0]; 
+0

ありがとうございます - 私はこれを見て、どうなるか見ていきます。 –

関連する問題