当前位置: 首页 > 编程语言 > C#

如何在ASP.NETMVC3中处理每个键的多个值?分享

时间:2023-04-10 23:54:31 C#

ASP.NETMVC3如何处理每个键的多个值?我有以下问题:我在最重要的功能中工作的系统之一是搜索页面。在此页面中,我有每页记录数、开始日期、结束日期和有问题的选项:类型。必须可以选择多种类型(大多数情况下,它们都会被选中)。为了完成这项工作,我创建了以下内容:Eventos:@Html.ListBox("events",Model.Events,new{style="width:100%"})它创建了一个列表框,我可以选择多个选项,我的查询提交表单时字符串将如下所示:/10?Period=9&Events=1&Events=3&recordsPerPage=10在那里你可以看到创建了两个事件(这是我之前说的类型)。此页面的操作方法将List作为其参数之一,代表两个事件值。当我想在MVCContrib中使用它时,问题就开始了。他们的寻呼机工作得很好,但按照我的要求,我创建了另一个寻呼机,显示用户所在位置前后五个页面的链接。为此,在我的部分代码中,我必须执行以下操作(这与MVCContribpager非常相似,它可以工作):foreach(varkeyinContext.Request.QueryString.AllKeys.Where(key=>key!=null)){routeValues[key]=Context.Request.QueryString[key];}routeValues["page"]=page;返回路由值;然后:@Html.ActionLink(page.ToString(),action,controller,GetRoute(page),null)问题是它是一个字典,它设置routeValues["events"]第二次擦除前一个。你们对如何使用它有什么想法吗?很好的问题。遗憾的是,使用Html.ActionLink帮助程序生成具有多个同名查询字符串参数的URL并不容易。所以我可以看到两种可能的解决方案为long[]编写一个能够解析逗号分隔值的自定义模型联编程序。这样您就可以保留GetRoute方法,该方法将生成以下url:period=9&events=1%2C3&recordsPerPage=10&page=5。公共类CommaSeparatedLongArrayModelBinder:DefaultModelBinder{publicoverrideobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){varvalues=bindingContext.ValueProvider.GetValue(bindingContext.ModelName);if(values!=null&&!string.IvaluesNullOrEmpty)(//TODO:这里最好进行最少的错误处理returnvalues.AttemptedValue.Split(',').Select(x=>long.Parse(x)).ToArray();}returnbase.BindModel(controllerContext,bindingContext);}}您将在Application_Start中注册:ModelBinders.Binders.Add(typeof(long[]),newCommaSeparatedLongArrayModelBinder());然后执行以下控制器操作将能够理解以前的URL:publicActionResultFoo(long[]events,intpage,intperiod,intrecordsPerPage){...}手动生成这个锚点:abc尝试查看WinTellect的PowerCollections,它允许您创建一个MultiDictionary,仍然不能有重复的键,但每个键可以有多个值。您应该编写一个以routeValue集合为目标的扩展方法,或者始终编写一个将Event参数转换为列表的自定义模型绑定器。如果您总是将“事件”视为列表,然后只需一个列表(通常长度为1)即可缓解您遇到的大部分问题。此时,您将只与列表界面进行交互。然后您可以编写一个自定义活页夹以允许您将其直接放在路径中,或者您可以将列表解压缩回查询字符串。有一个基于此的软件项目称为Unbinder,用于将对象解包为属性/值对,您可以轻松地将其用于查询字符串或其他目的。以上就是C#学习教程:HowtohandlemultiplevaluesperkeyinASP.NETMVC3?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: