MVC ActionLink 添加当前 url 中的所有(可选)参数
非常著名的 ActionLink
:
<%: Html.ActionLink("Back to List", "Index")%>
现在,这个链接位于我的“详细信息”视图中。索引视图是一个搜索页面。其 URL 如下所示:
http://localhost:50152/2011-2012/Instelling/Details/76?gemeente=Dendermonde&postcode=92**&gebruikerscode=VVKSO114421&dossiernr=114421%20&organisatie=CLB
正如您所看到的,参数数量相当多。显然我想在返回索引页面时保留所有这些参数,因此我需要将它们添加到 ActionLink
中。
现在,我厌倦了手动执行此操作,对于 1 可以,但对于 6 不行。这应该会容易得多。
问题:如何将当前 URL 的所有参数作为可选 RouteValues
返回到 ActionLink
中。
我一直在寻找 Request .QueryString
。一定与此有关。我正在考虑在 Global.asax 中编写一些静态方法来完成这项工作,但还没有成功。也许有一种我不知道的简单方法可以做到这一点?
想到的(有效)
编辑:这是我在global.asax:中
public static RouteValueDictionary optionalParamters(NameValueCollection c) {
RouteValueDictionary r = new RouteValueDictionary();
foreach (string s in c.AllKeys) {
r.Add(s, c[s]);
}
return r;
}
Details.aspx:
<%: Html.ActionLink("Back to List", "Index", MVC2_NASTEST.MvcApplication.optionalParamters(Request.QueryString))%>
我最好将此代码放在哪里?我猜不在 Global.asax 中...
编辑 2:
using System;
using System.Web.Mvc;
namespace MVC2_NASTEST.Helpers {
public static class ActionLinkwParamsExtensions {
public static MvcHtmlString CustomLink(this HtmlHelper helper, string linktext) {
//here u can use helper to get View context and then routvalue dictionary
var routevals = helper.ViewContext.RouteData.Values;
//here u can do whatever u want with route values
return null;
}
}
}
<%@ Import Namespace="MVC2_NASTEST.Helpers" %>
...
<%: Html.ActionLinkwParams("Index") %>
The very famous ActionLink
:
<%: Html.ActionLink("Back to List", "Index")%>
Now, this link is in my Details view. The Index view is a search page. The URL of that looks like this:
http://localhost:50152/2011-2012/Instelling/Details/76?gemeente=Dendermonde&postcode=92**&gebruikerscode=VVKSO114421&dossiernr=114421%20&organisatie=CLB
As you can see, quite the amount of parameters. Obviously I want to keep all these parameters when I return to the Index page, so I need to add them in the ActionLink
.
Now, I'm tired of doing that manually, it's ok for 1, but not for 6. This should go a lot easier.
Question: How do I return All parameters of the current URL into the ActionLink
as optional RouteValues
.
I've been looking to Request.QueryString
. It has to be something with that. I was thinking of writing some static method in Global.asax
doing the job but no luck yet. Maybe there is an easy way to do this which I don't know about?
Edit: This is what I came up with (which works)
In global.asax:
public static RouteValueDictionary optionalParamters(NameValueCollection c) {
RouteValueDictionary r = new RouteValueDictionary();
foreach (string s in c.AllKeys) {
r.Add(s, c[s]);
}
return r;
}
Details.aspx:
<%: Html.ActionLink("Back to List", "Index", MVC2_NASTEST.MvcApplication.optionalParamters(Request.QueryString))%>
Where do I best put this code? not in Global.asax
I guess...
Edit 2:
using System;
using System.Web.Mvc;
namespace MVC2_NASTEST.Helpers {
public static class ActionLinkwParamsExtensions {
public static MvcHtmlString CustomLink(this HtmlHelper helper, string linktext) {
//here u can use helper to get View context and then routvalue dictionary
var routevals = helper.ViewContext.RouteData.Values;
//here u can do whatever u want with route values
return null;
}
}
}
<%@ Import Namespace="MVC2_NASTEST.Helpers" %>
...
<%: Html.ActionLinkwParams("Index") %>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这就是我最终修复它的方法,我很自豪,因为它工作得很好而且非常干燥。
视图中的调用:
但由于重载,它可以是普通 ActionLink 所采用的任何内容。
助手:
助手从 URL 中获取路由中不存在的所有参数。
例如:这个 url:
因此它将获取邮政编码和组织并将其放置在新的 ActionLink 中。
通过重载,可以添加其他参数,并且可以删除现有 url 中的参数。
在使用重载的视图中:
在 URL 中,我的参数 postalCode 具有一些值。我的代码将 URL 中的所有参数设置为 string.Empty,然后从列表中删除此参数。
欢迎提出优化意见或想法。
This is how I finally fixed it, and i'm rather proud because it's working very well and very DRY.
The call in the View:
but with the overloads it can be anything which a normal ActionLink takes.
The Helper:
The helper takes all parameters from the url which are not in the route.
For example: this url:
So it will take the postalCode and the Org and place it in the new ActionLink.
With the overload, additional parameters can be added, and parameters from the existing url can be removed.
In the View using overloads:
in the URL I have the paramters postalCode with some value. my code takes All of them in the URL, by setting it to string.Empty, I remove this parameter from the list.
Comments or ideas welcome on optimizing it.
为 Request.QueryString 创建一个 ToRouteValueDictionary() 扩展方法,以按原样使用 Html.ActionLink 并简化视图标记:
您的扩展方法可能如下所示:
要在视图中使用扩展方法,请参阅此问题与解答:如何做我在 ASP.NET MVC 视图中使用扩展方法?
这比接受的答案更简单,并且涉及的代码少得多。
Create a ToRouteValueDictionary() extension method for Request.QueryString to use Html.ActionLink as-is and simplify your view markup:
Your extension method might look like this:
To use the extension method in your view see this question and answer: How do I use an extension method in an ASP.NET MVC View?
This is simpler and involves much less code than the accepted answer.
这是 ViewContext 的扩展方法,它根据请求路由值和查询字符串创建 RouteValueDictionary。
您可以将创建的 RouteValueDictionary 传递给 Html.ActionLink 或 Url.Action
如果请求 URL 中不存在 Page 参数,则会将其添加到生成的 URL 中。如果确实存在,其值将更改为 5。
这篇文章对我的解决方案有更详细的解释。
Here is an extension method for ViewContext that creates a RouteValueDictionary based on the request route values and querystring.
You can pass the created RouteValueDictionary to Html.ActionLink or Url.Action
If the Page parameter does not exist in the request URL, it will be added in the generated URL. If it does exist, its value will be changed to 5.
This article has a more detailed explanation of my solution.
我已经测试过这个及其工作原理。可选参数可以从查询字符串中获取
华泰
i have tested this and its working. optional parameters can be acquired from query string
HTH
也许最好的方法是编写自己的 html 帮助程序,在其中遍历之前的路由值字典并将路由值添加到当前操作链接,当然操作参数除外。
编辑:
你可以像这样编写 html 帮助器:
Perhaps the best way is to write your own html helper where you traverse through the previous route value dictionary and add route values to the current action link, except the action parameter off course.
edit:
You can write the html helper like this: