gpt4 book ai didi

asp.net-mvc - 如何覆盖 ASP.Net MVC 的默认模型绑定(bind)器,以便绑定(bind)到非可空值类型的空值不会触发模型验证错误

转载 作者:行者123 更新时间:2023-12-04 15:46:26 27 4
gpt4 key购买 nike

我发现在 ASP.Net MVC 中非常令人沮丧的是默认模型绑定(bind)器隐式应用 Required将空(字符串或 null)值绑定(bind)到不可为空的值类型而不是简单地将目标保留为其默认值,或者至少提供一个选项以允许其成为默认行为时,注释。

考虑到将模型上的目标属性类型更改为可空值不方便的情况,我可以使用的最短代码量是多少,以允许默认模型绑定(bind)器简单地跳过将空值绑定(bind)到不可空值的尝试值类型?我假设我需要子类 DefaultModelBinder ,但我不确定我需要覆盖什么才能实现所需的行为。

例子:

<input type="text" name="MyField"/>

不带值提交:
public ActionResult MyAction(MyModel model)
{
// do stuff
}

public class MyModel
{
public int MyField { get; set; }
}

楼盘 MyField应该允许保留其默认值 0从表单中发布了一个空值。

假设我不能简单地更改属性类型 Nullable<int> .

最佳答案

这样的事情怎么样? ( 免责声明: 未经任何程度的置信测试)

public class NonRequiredModelBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
var result = base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
if (result == null && propertyDescriptor.PropertyType.IsValueType)
return Activator.CreateInstance(propertyDescriptor.PropertyType);

return result;
}
}

这个想法——理论上——是确定 DefaultModelBinder的值是多少。分配给属性,检查它是否为空值,然后将其分配给 ValueType 的默认值那就是被束缚。

这应该会阻止活页夹添加 ModelState错误,并且仍然不会影响其他属性的验证,例如 [Range]
我建议更进一步并创建自己的属性(即 NonRequiredAttribute )。然后在您的自定义模型绑定(bind)器中,您可以检查该属性是否具有新的 NonRequired属性,并执行此自定义代码 仅限 在这种情况下。

关于asp.net-mvc - 如何覆盖 ASP.Net MVC 的默认模型绑定(bind)器,以便绑定(bind)到非可空值类型的空值不会触发模型验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12706163/

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