更新(2016 年9月21日) - 感谢Digbyswift评论此解决方案仍然适用于MVC5.
更新(2012 年4月30日) - 注意那些在搜索等问题上遇到这个问题的人 - 接受的答案不是我最终如何做到这一点 - 但我接受了它,因为它可能在某些情况下有效. 我自己的答案包含我使用的最终解决方案,它可以重复使用并适用于任何项目.
它也被证实可以在MVC框架的v3和v4中工作.
我有以下模型类型(类的名称及其属性已更改以保护其身份):
public class MyExampleModel
{
public string[] LongPropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将此属性绑定到一堆(> 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?
<% using (Html.BeginForm("SubmitUserName")) { %>
<input type='text' name='user-name' />
<input type='submit' value='Send' />
<% } %>
Run Code Online (Sandbox Code Playgroud)
什么应该是相应的Action方法的签名来接受user-name参数?
public ActionResult SubmitUserName(string user-name) {...}
Run Code Online (Sandbox Code Playgroud)
上面的方法签名由于某种原因不起作用;-)
我知道有一个ActionNameAttribute处理行动名称破折号的情况.有类似的东西ParameterNameAttribute吗?