2010-04-14 60 views
2

我想知道是否有创建方式的ActionLink或类似的,改变只有实际查询的一些参数,并保持所有其它参数不变。例如,如果我像http://example.com/Posts/Index?Page=5&OrderBy=Name&OrderDesc=True我想只改变Page,或者OrderBy参数,并保持所有其他参数相同的URL,即使是那些我还不知道的(比如当我想添加一个Search参数或也有类似的东西)。如何获得在ASP.NET MVC所有活动参数(2)

我目前的行动的头看起来是这样的:

public ActionResult Index(int? Page, string OrderBy, bool? Desc) 

,我只在值感兴趣,这种控制器“吃”。然而,我想要当我扩展这个动作时(例如用string Search参数),链接应该像以前一样工作。

这里是我做的已经:

  1. 创建一个新的RouteValueDictionaryRouteData.Values
    • 问题应有尽有它:这只是填补了在路由使用的参数,因此所有其他可选参数(如Page)到控制器丢失
  2. 将所有内容从HttpContext.Request.QueryString添加到以前的字典
    • 这是我目前使用的
    • 问题:它可能有一些垃圾的东西,该控制器didn`t要求,如果页面使用POST加载它不工作。您还没有任何ModelBindings(但这不是太大的问题,因为我们正在重新发送反正一切)
  3. 使用HttpContext.Request.Params
    • 问题:这有太多的垃圾数据,恕我直言,一个人不应该添加到被传递到ActionLink

于是问题一个RouteValueDictionary

  1. 是否有一个RVD具有传递给控制器​​,并使用它的所有数据?
  2. 这是解决方案好,还是有我也没多想什么注意事项(主要是改变一些查询参数,同时保持其他不变的情况下)?
  3. 有没有办法过滤掉Params对象中的“垃圾”数据?

编辑:检查了RouteData.DataTokens变量,但它通常是空的,并且不包含我需要的所有东西。它似乎只包含某个地方路由所需的参数,但不包含所有参数。

+1

你有没有在'RouteData.DataTokens'字典看?他们可能在那里...如果他们是我会重新发布为答案。 – Charlino 2010-04-14 22:55:39

+0

@Charlino:那就是他们应该去的地方。 http://msdn.microsoft.com/en-us/library/system.web.routing.routedata.datatokens.aspx – 2010-04-15 00:48:56

+0

是的,这就是我的想法。有趣的是,你在DataTokens中发现'area',因为我会认为它被用来找到匹配的路线。 – Charlino 2010-04-15 01:22:50

回答

-1

有在RouteData.DataTokens看看。

RouteData.DataTokens @ MSDN documentation

获取传递给路由处理,但是当ASP.NET路由决定路径是否符合要求,不使用自定义的值的集合。

HTHS,
查尔斯

+0

对我来说Viewcontext.RouteData.DataTokens属性是空的(Count == 0),除非我定义了需要我提供的一些信息的路由,但这不是我的观点。似乎这些参数不会传递给路由处理程序。 – SztupY 2010-04-15 10:03:21

+0

这仍然给我的问题。我有一个URL,如Source?investigationKey = 2。从RouteData.Values我只能得到控制器和操作。我没有在任何地方获得“调查密钥”。 有没有人找出如何得到这个? – ntombela 2010-05-08 00:47:28