asp.net mvc 2 - 模型绑定和选择列表

时间:2010-07-20 18:21:23

标签: c# asp.net-mvc asp.net-mvc-2 modelbinders

我有以下选择列表:

<select d="Owner_Id" name="Owner.Id">
    <option value="">[Select Owner]</option>
    <option value="1">Owner 1</option>
    <option value="2">Owner 2</option>
    <option value="3">Owner 3</option>
</select>

它必然会受到:

public class Part
{
    // ...other part properties...
    public Owner Owner {get; set;}
}

public class Owner
{
    public int Id {get; set;}
    public string Name {get; set;}
}

我遇到的问题是,如果选择[Select Owner]选项,则抛出错误,因为我将空字符串绑定到int。我想要的行为是一个空字符串,只会导致Part上的null所有者属性。

有没有办法修改Part模型绑定器以获得此行为?因此,当绑定Part的Owner属性时,如果Owner.Id是一个空字符串,那么只返回一个null Owner。我无法修改所有者模型绑定器,因为我需要在自己的控制器中添加默认行为(添加/删除所有者)。

1 个答案:

答案 0 :(得分:1)

您可以尝试自定义模型装订器:

public class PartBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        if (propertyDescriptor.PropertyType == typeof(Owner))
        {
            var idResult = bindingContext.ValueProvider
                .GetValue(bindingContext.ModelName + ".Id");
            if (idResult == null || string.IsNullOrEmpty(idResult.AttemptedValue))
            {
                return null;
            }
        }
        return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
    }
}

然后:

[HttpPost]
public ActionResult Index([ModelBinder(typeof(PartBinder))]Part part)
{
    return View();
}

或在全球注册:

ModelBinders.Binders.Add(typeof(Part), new PartBinder());