gpt4 book ai didi

.net - 在绑定(bind)之前使用 MVC ModelBinders 过滤帖子值

转载 作者:行者123 更新时间:2023-12-02 04:11:54 24 4
gpt4 key购买 nike

在从 MVC2 中的 POST 数据绑定(bind)之前,我需要过滤掉一些值。不幸的是,我无法更改有时会传递“N/A”以获取要映射为十进制的表单值的客户端代码?类型。需要发生的是,如果“N/A”是 POST 值,则在绑定(bind)/验证之前将其空白。

我整个早上都在尝试使用扩展 DefaultModelBinder 的 ModelBinder 让它工作:

public class DecimalFilterBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext,
ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.PropertyType == typeof(decimal?))
{
var model = bindingContext.Model;
PropertyInfo property = model.GetType().GetProperty(propertyDescriptor.Name);
var httpRequest = controllerContext.RequestContext.HttpContext.Request;
if (httpRequest.Form[propertyDescriptor.Name] == "-" ||
httpRequest.Form[propertyDescriptor.Name] == "N/A")
{
property.SetValue(model, null, null);
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
}

我遇到的问题是我不知道如何访问列表中的原始发布值。我不能只到 Form[propertyDescriptor.Name]因为它包含在表单中的列表项中(例如,输入实际上是 Values[0].Property1 )。我将模型绑定(bind)器连接到 global.asax 并且运行良好,我只是不知道如何在默认绑定(bind)发生之前获取原始表单值以将其过滤为空字符串。

最佳答案

哇,bindingContext 有一个 ModelName 属性,它为您提供前缀(用于列表项)。使用它可以让我获得原始表单值:

...
var httpRequest = controllerContext.RequestContext.HttpContext.Request;
if (httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "-" ||
httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "N/a")
{
property.SetValue(model, null, null);
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
...

关于.net - 在绑定(bind)之前使用 MVC ModelBinders 过滤帖子值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661287/

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