小编典典

Asp.Net MVC 2-将模型的属性绑定到其他命名值

c#

更新(2016 9月21日) -感谢Digbyswift指出此解决方案仍可在MVC5中使用。

更新(2012 4月30日) -注意人们在搜索等过程中遇到的问题-可以接受的答案不是我最终这样做的方式-
但是我将其保留为接受,因为它在某些情况下可能有用。
我自己的答案包含了我使用的最终解决方案
,该解决方案是可重用的,并且将适用于任何项目。

也已确认它可以在MVC框架的v3和v4中使用。

我具有以下模型类型(已更改类的名称及其属性以保护其标识):

public class MyExampleModel
{
  public string[] LongPropertyName { get; set; }
}

然后,此属性绑定到一堆(> 150)复选框,其中每个人的输入名称当然是LongPropertyName

表单使用HTTP GET提交到url,并说用户选择了其中三个复选框-url将具有查询字符串
?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c

然后最大的问题是,如果我选中所有(或什至只是一半以上!)复选框,我将超过IIS上的请求过滤器强制执行的最大查询字符串长度!

我不想扩展它-所以我想一种减少这个查询字符串的方法(我知道我可以切换到POST-但即使如此,我仍然想最小化客户端发送的数据中的绒毛数量) 。

我想做的是将LongPropertyName绑定简单地定为“ L”,这样查询字符串将变为?L=a&L=b&L=c
不更改代码中的属性名称

有问题的类型已经有一个自定义模型绑定程序(从DefaultModelBinder派生),但已附加到其基类上-
因此,我不想在其中放置派生类的代码。当前,所有属性绑定均由标准DefaultModelBinder逻辑执行,我知道该逻辑使用System.ComponentModel中的TypeDescriptors和Property
Descriptors等。

我有点希望可以有一个属性可以应用到该属性以使其正常工作-存在吗?还是我应该考虑实施ICustomTypeDescriptor


阅读 254

收藏
2020-05-19

共1个答案

小编典典

您可以使用BindAttribute完成此操作。

public ActionResult Submit([Bind(Prefix = "L")] string[] longPropertyName) {

}

更新资料

由于’longPropertyName’参数是模型对象的一部分,而不是控制器操作的独立参数,因此您有两个其他选择。

您可以将模型和属性作为动作的独立参数,然后在动作方法中手动将数据合并在一起。

public ActionResult Submit(MyModel myModel, [Bind(Prefix = "L")] string[] longPropertyName) {
    if(myModel != null) {
        myModel.LongPropertyName = longPropertyName;
    }
}

另一个选择是实现自定义Model Binder,该Model
Binder手动执行参数值分配(如上),但这很可能会导致过度使用。如果您对此感兴趣,请参考以下示例:Flags Enumeration Model
Binder

2020-05-19