问题标签 [modelbinders]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
5905 浏览

asp.net-mvc - 为什么 ASP.NET MVC 在数据绑定期间关心我的只读属性?

编辑:添加赏金,因为我正在寻找除此之外的 MVC3 解决方案(如果存在):

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;


我的“地址”模型上有一个只读属性'CityStateZip'

这只是从美国地址获取城市、州、邮编的便捷方式。如果国家不是美国,它会抛出异常(调用者应该首先检查)。

这是我模型的一部分,所以它被绑定了。在 ASP.NET MVC2 RC2 之前,此字段在数据绑定期间从未引起问题。我什至从未真正想过它——毕竟它只是只读的。

现在虽然在 2010 年 1 月的 RC2 版本中,它在数据绑定期间给了我一个错误 - 因为默认模型绑定器似乎想要检查这个值(即使它是只读的)。

触发此错误的是“base.OnModelUpdated”行。

模型绑定器的最后几分钟更改显然导致了这种行为变化 - 但我不太确定它的后果是什么 - 或者这是否是一个错误?我正在将此传递给 MVC 团队,但很好奇在此期间是否有其他人有任何建议如何防止此属性绑定。

这篇文章非常值得一读有关这些更改的内容——但根本没有提到只读属性(不是我期望的那样)。问题(如果有的话)可能比这种情况更广泛 - 我只是不确定是否有任何反击 - 如果有的话!

ASP.NET MVC 中的输入验证与模型验证


根据@haacked 的要求,这是堆栈跟踪:

我只需将以下行添加到 ANY 模型并发布到相应的操作方法即可。在这种情况下,我将它添加到我最简单的模型中。

[TargetInvocationException:对象“Rolling_Razor_MVC.Models.ContactUsModel”上的属性访问器“Foo”引发以下异常:“bar”] System.ComponentModel.ReflectPropertyDescriptor.GetValue(对象组件)+390 System.Web.Mvc.<>c__DisplayClassb.<GetPropertyValueAccessor>b__a() +18 System.Web.Mvc.ModelMetadata.get_Model() +22 System.Web.Mvc. ModelMetadata.get_RealModelType() +29 System.Web.Mvc.<GetValidatorsImpl>d__0.MoveNext() +38 System.Linq.<SelectManyIterator>d__14`2.MoveNext() +273 System.Web.Mvc.<Validate>d__5。 MoveNext() +644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, 对象模型) +60 System.Web.Mvc。 DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext) +1048 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +280 System.Web.Mvc.Controller.TryUpdateModel(TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel(TModel 模型) +73

0 投票
1 回答
221 浏览

asp.net-mvc - 复杂的强类型对象 + 默认 ModelBinder

我有以下复杂模型: Category - has -> List which has -> List

我正在尝试进行创建操作,我可以在其中提取所有现有类别并为每个类别插入一个列表,包括子项目。例如:-Cat1 -- NewItemGroup1 --- NewItem1 --- NewItem2 --- NewItem3 --- NewItem4

-Cat2 -- NewItemGroup2 --- NewItem1 --- NewItem2 --- NewItem3 --- NewItem4

我的问题,我可以使用默认的模型绑定器来实现这一点吗?还是我应该使用其他东西?那会增加多少工作:)?

谢谢!

0 投票
2 回答
5191 浏览

asp.net-mvc - IModelBinder 上的 BindProperty 和 SetProperty 有什么区别

我正在 Mvc 应用程序中创建自定义模型绑定器,我想将字符串解析为枚举值并将其分配给模型属性。我已经让它覆盖了该BindProperty方法,但我也注意到有一个SetProperty方法。

我不确定两者之间有什么区别以及我是否以推荐的方式这样做。

0 投票
1 回答
941 浏览

asp.net-mvc - DefaultModelBinder 嵌套级别+其他绑定器的问题

我有我认为有点正常的情况,我需要将表单帖子绑定到“订单”模型。这个模型有几个层次的信息:

使用 DefaultModelBinder,如果我将表单发布到以该 Order 模型作为参数的操作,则以下字段 JustWork(TM):

该字段不:

我的皱纹与乡村财产有关。在我们的例子中,Address.Country 返回一个 Country 类实例(ISO2/3/Name/Code 逻辑)。它不是一个字符串。默认情况下它不起作用也就不足为奇了。

我的第一个想法是创建一个 CountryModelBinder(继承 DefaultModelBinder)和 ModelBinders.Binders。将其添加到 Country 的类型中。当我这样做时, CountryModelBinder 永远不会在上面的场景中被调用。

我的第二个想法是创建一个 AddressModelBinder(继承 DefaultModelBinder)并将其绑定到我们的 Address 类型。尽管确实会调用它,但“Country”的 SetProperty 调用具有一个空值,即使该表单已发布了一个名为“Billing.Address.Country”的字段。

经过一番修改后,模型绑定行为似乎仅在模型是操作所需的顶级类时才调用 CreateModel,并且所有其他绑定器都为子属性调用了它们的 BindPropery/SetProperty。

换句话说,如果我为 Order、OrderAddress(Billing)、Address 和 Country 创建模型绑定器。对于接受订单的操作,仅调用 OrderModelBinder.CreateModel。某些事情会调用 ORderAddress 和 Address.BindProperty/SetProperty,有时 SetProperty 值参数在明确发布在与其他字段属性映射匹配的名称中时为空。

只需向 OrderModelBinder 添加代码即可将 Billing.Address.Country 从 Request.Form 中拉出,这很容易。但是我有多个使用 Address 的模型,并且让所有模型都这样做似乎坏了。

我在这里想念什么?在这种情况下,有没有办法让 CountryModelBinder 真正被调用?我认为当 Billing.Address.Country 映射到地址绑定器的 Country 属性时,应该调用 CountryModelBinder。

0 投票
3 回答
878 浏览

c# - 将数据绑定到 Asp.net MVC 中的现有对象

在 ASP.Net MVC 模型绑定器中,可以创建绑定类型的对象,然后更新其属性。

例如

在这段代码中,我想知道是否有类似于 BindModel(child) 调用的东西,有点像来自控制器的 TryModelUpdate()?

0 投票
2 回答
3778 浏览

asp.net-mvc - 如何更新自定义 ModelBinder 以使用 ASP.NET MVC RC2 中更改的 ModelBindingContext.ValueProvider 接口

我有一个自定义模型绑定器,它采用逗号分隔列表并清除所有空值,然后将其传递给默认模型绑定器。这在 ASP.NET MVC Preview 2 中有效,但是当我升级到 RC2 时,下面的代码将无法编译,因为 ValueProvider 的接口只有一个 GetValue() 方法,没有 [] 访问器。我在下面做的事情是否可以通过绑定上下文中的一些其他机制?我宁愿不必为这种简单的情况创建一个完整的模型活页夹。主要目标是当值绑定到 List<SomeEnum> 时,将跳过任何空值。

0 投票
1 回答
2160 浏览

asp.net-mvc - 有没有办法让 DefaultModelBinder 在绑定到列表时忽略空项目

我有一个场景,我想更改 DefaultModelBinder 如何绑定到枚举列表的行为。

我有一个枚举...

和一个模型类...

POST 正文是……

目前,在模型绑定之后,MyEnums 属性将包含...

有没有办法告诉模型绑定器忽略已发布数据中的空值,以便 MyEnums 属性如下所示?

0 投票
2 回答
16119 浏览

asp.net-mvc - ASP.NET MVC2 - 自定义模型绑定示例

我试图找到一些为我需要处理的独特绑定场景构建自定义模型绑定器的示例,但我发现的所有文章都是针对 MVC 的旧版本的,它们在 MVC2 中不再相关。我一直在参考 DefaultModelBinder 源代码,试图大致了解我需要做什么,但它比我的场景更复杂,而且我在隔离我需要实现的特定逻辑时遇到了麻烦。

我的目标是收集 Checkbox/Textbox 对的集合,对于所有 Checked 对,我想为 Checkbox 的值和关联的 Textbox 的值创建一个键/值对。聚合这些数据后,我需要对集​​合进行一些字符串序列化,以便将其存储在所需模型类型的字符串属性中。我已经以可管理的格式从表单发送数据,这将允许我将给定的复选框与特定的文本框相关联,这只是弄清楚如何在我需要的地方获取所有部分的问题。

有谁知道一些可以让我开始构建自定义模型绑定器的最新教程?

0 投票
1 回答
7979 浏览

asp.net-mvc - ASP.NET MVC - 能够处理数组的自定义模型绑定器

我需要实现一个功能,允许用户以任何形式输入价格,即允许 10 美元、10 美元、10 美元……作为输入。

我想通过为 Price 类实现一个自定义模型绑定器来解决这个问题。

表单包含一个数组或价格作为键

ViewModel 包含一个价格属性:

只要用户在 Value 输入中输入可转换为十进制的字符串,默认模型绑定器就可以很好地工作。我想允许像“100 USD”这样的输入。

到目前为止,我的价格类型的 ModelBinder:

如何实现正确处理数组的自定义模型 Binder?

0 投票
4 回答
36909 浏览

asp.net-mvc - Asp.net MVC 中的自定义 DateTime 模型绑定器

我想为DateTime类型编写自己的模型活页夹。首先,我想编写一个可以附加到模型属性的新属性,例如:

这是简单的部分。但是活页夹部分要困难一些。我想为 type 添加一个新的模型绑定器DateTime。我可以

  • 实现IModelBinder接口并编写自己的BindModel()方法
  • 继承DefaultModelBinder和覆盖BindModel()方法

我的模型具有如上所示的属性 ( Birth)。因此,当模型尝试将请求数据绑定到此属性时,我的模型绑定器BindModel(controllerContext, bindingContext)会被调用。一切都好,但是。如何从控制器/bindingContext 获取属性属性,以正确解析我的日期?我怎样才能到达PropertyDesciptor物业Birth

编辑

由于关注点分离,我的模型类是在不(也不应该)引用 System.Web.MVC 程序集的程序集中定义的。设置自定义绑定(类似于Scott Hanselman 的示例)属性在这里是不行的。