更新(2016 年 9月21日) -感谢Digbyswift指出此解决方案仍可在MVC5中使用。
更新(2012 年 4月30日) -注意人们在搜索等过程中遇到的问题-可以接受的答案不是我最终这样做的方式- 但是我将其保留为接受,因为它在某些情况下可能有用。 我自己的答案包含了我使用的最终解决方案,该解决方案是可重用的,并且将适用于任何项目。
也已确认它可以在MVC框架的v3和v4中使用。
我具有以下模型类型(已更改类的名称及其属性以保护其标识):
public class MyExampleModel { public string[] LongPropertyName { get; set; } }
然后,此属性绑定到一堆(> 150)复选框,其中每个人的输入名称当然是LongPropertyName。
LongPropertyName
表单使用HTTP GET提交到url,并说用户选择了其中三个复选框-url将具有查询字符串 ?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c
?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c
然后最大的问题是,如果我选中所有(或什至只是一半以上!)复选框,我将超过IIS上的请求过滤器强制执行的最大查询字符串长度!
我不想扩展它-所以我想一种减少这个查询字符串的方法(我知道我可以切换到POST-但即使如此,我仍然想最小化客户端发送的数据中的绒毛数量) 。
我想做的是将LongPropertyName绑定简单地定为“ L”,这样查询字符串将变为?L=a&L=b&L=c但 不更改代码中的属性名称 。
?L=a&L=b&L=c
有问题的类型已经有一个自定义模型绑定程序(从DefaultModelBinder派生),但已附加到其基类上- 因此,我不想在其中放置派生类的代码。当前,所有属性绑定均由标准DefaultModelBinder逻辑执行,我知道该逻辑使用System.ComponentModel中的TypeDescriptors和Property Descriptors等。
我有点希望可以有一个属性可以应用到该属性以使其正常工作-存在吗?还是我应该考虑实施ICustomTypeDescriptor?
ICustomTypeDescriptor
您可以使用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。