gpt4 book ai didi

asp.net-mvc - 我如何使用 ModelBinder 来更正用户可以看到的值?

转载 作者:行者123 更新时间:2023-12-02 07:49:54 27 4
gpt4 key购买 nike

我想为 ASP.NET MVC 编写一个模型绑定(bind)程序,它将更正用户可见的值。也许它会将值的首字母大写、修剪字符串等等。

我想将这种行为封装在模型绑定(bind)程序中。

例如,这里有一个用于修剪字符串的 TrimModelBinder(taken from here)

public class TrimModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext,
ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (propertyDescriptor.PropertyType == typeof(string))
{
var stringValue = (string)value;
if (!string.IsNullOrEmpty(stringValue))
stringValue = stringValue.Trim();

value = stringValue;
}

base.SetProperty(controllerContext, bindingContext,
propertyDescriptor, value);
}
}

这会将值设置到模型中,但是当页面重新显示时,原始值将保留(因为它们位于 ModelState 中)。

我只想向用户重新显示修剪后的值。

有很多方法需要重写 - 例如 OnPropertyValidatedOnPropertyValidating 等。

我可能可以让它工作,但我不想在重写错误的方法时产生一些意想不到的副作用。

当我生成 View 时,我不想尝试执行 Trim() 或任何逻辑。我想将这个逻辑完全封装在模型绑定(bind)程序中。

最佳答案

替换这个类。

  public class TrimModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext,
ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (propertyDescriptor.PropertyType == typeof(string))
{
var stringValue = (string)value;
if (!string.IsNullOrEmpty(stringValue))
stringValue = stringValue.Trim();

value = stringValue;
bindingContext.ModelState[propertyDescriptor.Name].Value =
new ValueProviderResult(stringValue,
stringValue,
bindingContext.ModelState[propertyDescriptor.Name].Value.Culture);
}

base.SetProperty(controllerContext, bindingContext,
propertyDescriptor, value);
}
}

编辑:由 simon 修改

(原始有空引用异常并添加更改以支持分层模型)

protected override void SetProperty(ControllerContext controllerContext,
ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor,
object value)
{
string modelStateName = string.IsNullOrEmpty(bindingContext.ModelName) ? propertyDescriptor.Name :
bindingContext.ModelName + "." + propertyDescriptor.Name;

// only process strings
if (propertyDescriptor.PropertyType == typeof(string))
{
if (bindingContext.ModelState[modelStateName] != null)
{
// modelstate already exists so overwrite it with our trimmed value
var stringValue = (string)value;
if (!string.IsNullOrEmpty(stringValue))
stringValue = stringValue.Trim();

value = stringValue;
bindingContext.ModelState[modelStateName].Value =
new ValueProviderResult(stringValue,
stringValue,
bindingContext.ModelState[modelStateName].Value.Culture);
}
else
{
// trim and pass to default model binder
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, (value == null) ? null : (value as string).Trim());
}
}
else
{
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}
}

关于asp.net-mvc - 我如何使用 ModelBinder 来更正用户可以看到的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2083645/

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