[英]Custom model binder for child collection
我已經搜尋過很多東西,希望有人可以幫助我。 我有一節課:
public class Person
{
public string Name { get; set; }
public ICollection<Toys> { get; set; }
}
我有一個控制器方法:
public ActionResult Update(Person toycollector)
{
....
}
我想綁定到收藏夾。 我意識到我只會得到ID,但會在控制器中處理它。 我只需要能夠瀏覽ID的集合即可。 我開始編寫模型活頁夾:
public class CustomModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.PropertyType == typeof(ICollection<Toys>))
{
//What do I do here???
}
}
那么如何從傳遞給我方法的值構建Toys集合呢? 謝謝!
編輯:看來我無法發布此答案對我自己的問題,所以我將只編輯我的帖子。 看起來您需要做的就是解析數據並將其添加到模型中,如下所示:
if (propertyDescriptor.PropertyType == typeof(ICollection)) {
var incomingData = bindingContext.ValueProvider.GetValue("Edit." + propertyDescriptor.Name + "[]");
if (incomingData != null)
{
ICollection<Toy> toys = new List<Toy>();
string[] ids = incomingData.AttemptedValue.Split(',');
foreach (string id in ids)
{
int toyId = int.Parse(id);
toys.Add(new Toy() { ToyID = toyId });
}
var model = bindingContext.Model as Person;
model.Toys = toys;
}
return;
}
您不需要為此定制模型綁定器。
請參閱Phil Haack的這篇文章以獲得完整的實現,但基本思路是,對於集合中的每個項目,您創建一個遵循以下命名約定的表單字段:
Toys[index].<FieldName>
因此,例如,如果要綁定3個Toy對象:
<input type="hidden" name="Toys[0].Id" value="1" />
<input type="hidden" name="Toys[1].Id" value="2" />
<input type="hidden" name="Toys[2].Id" value="3" />
重要的是要考慮所有索引值,不要跳過任何索引。 例如,如果您有一個格式值Toys[1].<FieldName>
還必須具有一個Toys[0].<FieldName>
值。
所有這些都說,取決於你需要完成什么,它可能更容易簡單地綁定到一組ID而不是整個對象。 您可以讓控制器操作將ID轉換為實際模型。
如果您更喜歡更簡單的Id-only方法,那么您需要做的就是在請求模型中創建一個字符串/ int / guid(無論您的id是什么)集合對象,然后創建一個或多個字段,每個字段都具有相同的名稱 。 Id值。 默認模型綁定器將自動處理從請求中的值創建集合。
在以上答案中給出n個玩具的基礎上,必須使用for循環正確索引,如下所示:
@for(var i = 0; i < Model.Toys.Count; i++)
{
@Html.HiddenFor(m => m.Toys[i].Id)
}
然后默認模型綁定將自動綁定post上的集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.