热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#在ASP.NETMVC中,如何使用Html.ActionLink生成重复名称(‘?v=1&v=2&v=3’)查询字符串

这不是关于如何正确地将一系列复选框绑定到模型属性的问题(一个常见问题)-我的网站可以完美地从请求(POST或GET查询字符串)中读取复选框值.这是关于如何使用Html.Action

这不是关于如何正确地将一系列复选框绑定到模型属性的问题(一个常见问题)-我的网站可以完美地从请求(POST或GET查询字符串)中读取复选框值.

这是关于如何使用Html.ActionLink生成一个链接,该链接可正确格式化查询字符串中的多个复选框值.

所以我有以下模型:

public class ModelType
{
public string[] V { get; set; }
}

我将三个复选框绑定到视图中的该模型,因为我有三个可能的值(是的,这些值的组合).

这是最终的HTML




如果在将表单作为GET提交到服务器时检查所有三个值,则生成的查询字符串当然为?V = 1& V = 2& V = 3.

模型绑定的工作很漂亮,并且一切都很顺利.

但是,假设我想产生一个指向相同动作的链接,传递一个匿名类型或RouteValueDictionary来产生相同的查询字符串.逻辑表明您将执行以下操作:

版本1:将ModelType实例作为视图上的模型:

<%= Html.ActionLink("Test link", null /* action name */, new { V = Model.V }) %>

版本2:直接将’V’成员初始化为数组:

<%= Html.ActionLink("Test link", null /* action name */,
new { V = new string[] { "1", "2", "3" } }) %>

[在这个问题上,我说的是RouteValueDictionary,因为在两种情况下,这两种匿名类型在链接生成发生之前都变成了匿名类型.]

在这两种情况下,生成的查询字符串如下:?V = System.String [].

现在,我知道这是因为链接生成器只是在数组上调用ToString().但是似乎无法传递MVC一个会导致其生成?V = 1& V = 2& V = 3的值.

由于两种语言都不允许我们这样做:

new { V="1", V="2", ... }

RouteValueDictionary也无法让我们执行以下操作:

d["V"] = "1"; d["V"] = "2"; ...

我还尝试了对RouteValueDictionary进行预处理的绝望措施,以便为每个IEnumerable生成一个字符串,每个值均用逗号分隔,然后将该字符串写回-这样查询字符串就结束了像这样:?V = 1,2,3.

但是,当然,MVC不会自动将这样的字符串绑定到数组(您只需在数组中得到一个字符串,其中包含逗号即可);因此,将以这种方式绑定的每个属性都必须进行自定义绑定-对我而言,这似乎有点麻烦了.

所以看来我被卡住了.

我想念什么吗?我需要编写要执行的特殊版本的ActionLink吗?

一如既往的任何帮助,我们将不胜感激.

解决方法:

所以我已经去研究了,这是我的观点.我希望有人能提出一个更乐观的答案,但我认为不可以.

完全遵循Html.ActionLink扩展方法,它产生的核心URL是由(咳嗽)密封和(咳嗽!)内部类System.Web.Mvc.ParsedRoute生成的,并且该方法绑定在System.Web中路由组装.

在此方法的最后(这是一个Reflector列表)-这是它生成查询字符串的方式:

if (unusedNewValues.Count > 0)
{
bool flag5 = true;
foreach (string str2 in unusedNewValues)
{
object obj5;
if (acceptedValues.TryGetValue(str2, out obj5))
{
builder.Append(flag5 ? '?' : '&');
flag5 = false;
builder.Append(Uri.EscapeDataString(str2));
builder.Append('=');
builder.Append(Uri.EscapeDataString(
Convert.ToString(obj5, CultureInfo.InvariantCulture)));
}
}
}

我首先要提到的是,unusedNewValues是一个HashSet.不幸的是,这意味着它只会呈现一个名称/值配对.

您不能用嵌入的a = b& a = c(…)字符串来伪造数据字符串,因为字符串值已转义-因此,除非替换路由框架,否则根本无法在Mvc中生成此类查询字符串.

结果,一种替代方法是编写一个收集数据类型,该数据类型将执行以下操作(这是一个肮脏的实现):

public class StringCollection : List
{
public override string ToString()
{
//use the pipe character as a delimiter - but this doesn't work
//if the strings being carried around ccould naturally contain '|'!
return string.Join("|", this.ToArray());
}
}

然后为首先使用默认方法的类型实现一个自定义模型绑定程序(派生自DefaultModelBinder),然后检查所得集合是否仅包含一个带有’|’的字符串.里面的字符.如果是这样,它将对集合进行后处理,将其内容替换为来自单个字符串的扩展值.

这很可怕-但我目前能想到的所有解决方案中最讨厌的就是.

刚才必须对我所有现有的模型类型进行大量更改,这些模型类型使用可能绑定到查询字符串值的字符串集合…


推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
狠心狼fd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有