MVC3 IModelBinder和更新成员数据

时间:2011-11-22 19:13:56

标签: asp.net-mvc asp.net-mvc-3

我有一个这样的课程

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?

谢谢

2 个答案:

答案 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);