- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为 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 中)。
我只想向用户重新显示修剪后的值。
有很多方法需要重写 - 例如 OnPropertyValidated
和 OnPropertyValidating
等。
我可能可以让它工作,但我不想在重写错误的方法时产生一些意想不到的副作用。
当我生成 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/
有人能告诉我在 global.asax 中使用 [ModelBinder()] 属性与通过 ModelBinders.Add() 注册模型绑定(bind)器的优缺点吗? 我能想到的一个优点是它更明确,
我想创建一个基于 CMS 内容的动态表单。我的字段(以及更多属性)的标签将在 CMS 中生成。为了说明,我在 Controller GET 操作中静态创建了 View 模型。使用自定义模型绑定(bin
我有一个自定义的 ModelBinder,它使用这样的代码将 web 与对象绑定(bind)" [ModelBinder(typeof(CustomizedModelBinder))]
我正在尝试创建一个非常简单的表单来从模型集合中发回一些值 当我单击“提交”时,查看返回的集合,它不包含任何对象。我还发现 asp-for 没有生成我期望的集合索引。 我有一个简单的模型 public
我有一个问题,我正在开发一个 asp.net mvc 项目。网站使用土耳其语。当我将此网站发布到 IIS 时,土耳其语字符在网页中变得疯狂,所以我在 web.config 中将全局化设置为 在此之后
我们有一个自定义模型绑定(bind)器,可以将 json 反序列化为对象列表,我想将该模型绑定(bind)器用于多个 View ,每个 View 都使用不同的 View 模型。 我们想要避免的是必须为
正如问题标题所暗示的那样,我正在尝试通过对 MVC Controller 的 $ajax 调用来发布数组集合(如果您愿意,可以是数组数组)以绑定(bind)到 Controller 。我已经找到了所有
我遇到了一个似乎与反射和模型联编程序验证有关的问题,尤其是 FormatterParameterBinding.ExecuteBindingAsync(..),尽管我可以使用方法来执行操作如果我可以使
上下文:在 Asp.net Core 2.1 下的 WebAPI 中,我必须创建一个 POST 端点, [服务器]/MyController/{Parameter1}/MoreRouteThing/。
我有一个自定义模型 Binder ,我知道将其分配给我的操作方法的两种方法: 要么在方法上: public ActionResult MyAction([ModelBinder(typeof(MyCu
我有一个 POCO,我将其用作 MVC3 中操作的参数。像这样: 我的类型 public class SearchData { public string Property1 { get; s
我一直在用 ASP.NET MVC2 进行一些实验,并遇到了一个有趣的问题。 我想围绕将用作 MVC 应用程序中的模型的对象定义一个接口(interface)。此外,我想通过使用验证属性标记此接口(i
我在某些模型中使用了一个子模型类(UserInfo),它应该包含一些与用户相关的信息。该子模型可用于各种模型,例如 public class Model { int string Value
我有以下复杂模型: 类别 - 有 -> 列表 有 -> 列表 我正在尝试进行创建操作,我可以在其中提取所有现有类别并为每个类别插入一个列表,包括子项目。例如: -Cat1 -- 新项目组1 --- 新
我的模型上有一组对象,我正在使用 EditFor 函数在 View 中呈现这些对象,并且我有一个 EditorTemplate 负责实际呈现每个对象。 @Html.EditorFor(model =>
我有一个正在使用的 api,它将对我的服务器端方法之一执行一些 JSON 的 POST。 我正在创建一些映射到该 JSON 结构的 C# 类。我的问题是发布给我的字段之一名为“对象”,它是一个字符串。
我想创建一个不同语言的网站。我已经读到我可以创建一个 ActionFilter ,但我有一个小问题: 我必须创建一个自定义 ModelBinder 才能使用英语和德语数字格式(123,456,789.
我想为 ASP.NET MVC 编写一个模型绑定(bind)程序,它将更正用户可见的值。也许它会将值的首字母大写、修剪字符串等等。 我想将这种行为封装在模型绑定(bind)程序中。 例如,这里有一个用
我有一个正在使用的 api,它将对我的服务器端方法之一执行一些 JSON 的 POST。 我正在创建一些映射到该 JSON 结构的 C# 类。我的问题是发布给我的字段之一名为“对象”,它是一个字符串。
我已经实现了 ModelBinder,但它的 BindModel() 方法没有被调用,并且我收到错误代码 500 并显示以下消息: 错误: 不能从“MyModelBinder”创建一个“IModelB
我是一名优秀的程序员,十分优秀!