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

发布于 2024-09-10 19:46:39 字数 770 浏览 7 评论 0原文

我有以下选择列表:

<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] 选项,则会抛出错误,因为我绑定了一个空字符串到一个整数。我想要的行为是空字符串只会导致零件上的所有者属性为空。

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

I have the following select list:

<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>

It gets bound to:

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

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

The problem I'm running into is that if the [Select Owner] option is selected then an error is thrown because I'm binding an empty string to an int. The behavior I want is an empty string just results in a null Owner property on Part.

Is there a way to modify the Part model binder to get this behavior? So when binding the Owner property of Part, if Owner.Id is an empty string then just return a null Owner. I can't modify the Owner model binder as I require the default behavior in its own controller (adding/removing Owners).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心奴独伤 2024-09-17 19:46:43

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

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());

You could try a custom model binder:

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);
    }
}

And then:

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

or register it globally:

ModelBinders.Binders.Add(typeof(Part), new PartBinder());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文