我有一个这样的课程
public class Position
{
public string Title { get; set; }
public IEnumerable<string> PhoneNumbers { get; set; }
}
我想使用textarea接受每行一个电话号码。之后模型显然没有正确绑定,所以我发现IModelBinder
可以帮助解决这个问题,但我不知道如何将转换后的数据注入模型中。
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var phones = bindingContext.ValueProvider.GetValue("phones");
var values = phones.AttemptedValue;
var phoneList = ..... //split and stuff
//now what? how to set it back?
谢谢
答案 0 :(得分:0)
创建模型的新实例,填充其属性并将其返回。多数民众赞成。
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var phones = bindingContext.ValueProvider.GetValue("phones"); var values = phones.AttemptedValue; var phoneList = ..... //split and stuff //IE Position position = new Postion(); position.PhoneNumbers = phoneList; return position; }
答案 1 :(得分:0)
创建一个新课程PhoneNumberList
,并在模型中使用该课程代替IEnumerable<string>
。然后,您可以通过复制现有代码为PhoneNumberList
创建自定义模型绑定器。绑定现有模型类型Position
将不会受到影响。
或者(但是更复杂的解决方案) - 您可以保留IEnumerable<string>
的现有定义。您可以继承DefaultModelBinder
并检查任何PropertyMetadata
属性的IEnumerable<string>
。如果它包含您添加的一些标识元数据(例如,通过属性),那么它可以执行您的自定义绑定,否则它将恢复为基本绑定。
顺便说一句 - 您还可以考虑使用bindingContext.ModelName
而不是将值提供程序密钥硬编码为“phone”:
var phones = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);