簡體   English   中英

自定義模型活頁夾,用於兒童收藏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM