gpt4 book ai didi

c# - 在 ASP.NET MVC 的自定义模型 Binder 中绑定(bind)属于另一个对象的列表

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:43 24 4
gpt4 key购买 nike

我知道有人问过这样的问题,但这可能有点不同。

下面是我的事件对象:

Event : IEvent
public int Id
public string Title
public List<EventContact> Contacts

和 EventContact:

EventContact
public int Id
public string Name
public string Email

因此,Event 有一个 EventContact 对象列表。现在,Event 还实现了 IEvent - 因此是自定义模型绑定(bind)器。我使用 IEvent 而不是 Event,因此当默认模型联编程序尝试执行它的操作时,它让我知道它无法创建“IEvent”。

我的 View 中填充了联系信息:

<input type="text" name="contact[0].Name" value="DB Value"/>
<input type="text" name="contact[1].Name" value="DB Value"/>
<input type="text" name="contact[2].Name" value="DB Value"/>

<input type="text" name="contact[0].Email" value="DB Value"/>
<input type="text" name="contact[1].Email" value="DB Value"/>
<input type="text" name="contact[2].Email" value="DB Value"/>

<!-- Event fields, etc -->

因此,在我的自定义模型 Binder 中,我能够看到所有值 - 太棒了!唯一的问题是,我真的不确定如何获取所有联系人字段并从中创建联系人列表,以及绑定(bind)所有事件字段。

最佳答案

为了实现上述目标,我只是查询了现有绑定(bind)上下文的 ValueProvider 以获取所有 EventContact 字段,并将其与新的绑定(bind)上下文一起发送到默认模型绑定(bind)器:

IDictionary<string, ValueProviderResult> contactValueProvider = bindingContext.ValueProvider
.Select(t => new { t.Key, t.Value })
.Where(t => t.Key.Contains("EventContact"))
.ToDictionary(t => t.Key, t => t.Value);

ModelBindingContext contactBindingContext = new ModelBindingContext()
{
ModelName = "EventContact",
ModelState = bindingContext.ModelState,
ModelType = typeof(List<EventContact>),
PropertyFilter = bindingContext.PropertyFilter,
ValueProvider = contactValueProvider
};

_event.Contacts = ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, contactBindingContext) as IQueryable<EventContact>;

它有效,所以我很高兴 :P

关于c# - 在 ASP.NET MVC 的自定义模型 Binder 中绑定(bind)属于另一个对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com