2017-06-24 28 views
0

私はViewを持っています。これはHTMLを動的にレンダリングします。それはこのように見て終わる:POSTされたフォームフィールドの複雑な配列をループする

<form asp-controller="Home" asp-action="Save"> 
    <!-- Location widget class --> 
    <input name="widgets[0].Name" /> 
    <input name="widgets[0].Type" value="Location" /> 
    <input name="widgets[0].Location" /> 

    <!-- Rating widget class --> 
    <input name="widgets[1].Name" /> 
    <input name="widgets[1].Type" value="Rating" /> 
    <input name="widgets[1].Rating" /> 
    <input name="widgets[1].Remark" /> 

    <button type="submit">Submit</button> 
</form> 

各「ウィジェット」のように、別のクラスで定義されています (poperties NameTypeが親Widgetクラスで定義されています)

public class Location : Widget 
{ 
    public string Location {get;set;} 
} 

public class Rating : Widget 
{ 
    public string Rating {get;set;} 
    public string Remark {get;set;} 
} 

私が持っている問題は、POSTこのフォームを私のコントローラに戻さなければならないということです。そこでは私はこのような何かをできるようにしたい:私は単にHttpContext.Requestオブジェクトからそのような特性を読み出すことができないように思え

public IActionResult Save() 
{ 
    var req = HttpContext.Request; 

    foreach(var widget in req.widgets) 
    { 
     if(widget.Type == "Location") { 
      ... 
     } 
     else if(widget.Type == "Rating") { 
      ... 
     } 
     // etc. 
    } 
} 

これを行う方法はありますか?

+0

おそらくカスタムモデルバインダーを使用しています。モデル結合多型を調べる – Mardoxx

答えて

1

あなたがのparamsにIFormCollectionオブジェクトを追加する場合はKeyValuePairsとしてフォームフィールドを読むことができます:

public IActionResult Save(IFormCollection formCollection) 

あなたの具体的な問題については、私はあなたが以下のように行うことができます信じている:

私がテストしていません次のコードが、私はそれが動作することはほとんど確信しています!

public async Task<IActionResult> Save(List<Widget> widgets) 
{ 
    for(var i = 0; i < widgets.Count; i++) 
    { 
     if(widgets[i].Type == "Location") { 
      var locationObj = new Location(); 
      await TryUpdateModelAsync(locationObj, $"widgets[{i}]"); 
      //Do whatever you want with the object. 
     } 
     else if(widgets[i].Type == "Rating") { 
      var ratingObj = new Rating(); 
      await TryUpdateModelAsync(ratingObj, $"widgets[{i}]"); 
      //Do whatever you want with the object. 
     } 
     // etc. 
    } 
    ... 
} 

ご支援いただければ教えてください。

関連する問題