如何通过Extension方法为URL.Action添加额外参数

时间:2014-06-05 12:52:51

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor

我试图了解如何向URL.Action添加额外参数,并将其作为结果链接的一部分。

让我们假设以下内容:

myParm = "myTestParameterValue";
@Url.Action("Edit", "Order", new { id=item.Id}, null,myParm)

会导致:

/Order/Edit/1/myTestParameterValue

我非常感谢此Action Sample的扩展方法的一些示例代码,以了解如何获取参数以及如何生成链接。

我想它会开始像:

public static MvcHtmlString Action(this HtmlHelper helper, string actionName, string controllerName, object routeValues, boolean IsHashRequired)

If (IsHashRequired)
{
  String myHash = GetHash();
}

// Pseudocode .... string myNewLink = ... + myHash

非常感谢提前

修改

我需要计算哈希以添加到结果链接。一个更好的参数是布尔值。我已相应编辑了代码。

EDIT2:

    public static IHtmlString Action(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues, string protocol, bool isHashRequired )
{

     if (isHashRequired)
     {
         routeValues["hash"] = "dskjdfhdksjhgkdj"; //Sample value.
     }
     return urlHelper.Action(???); // Resultant URL = /Order/Edit/1/dskjdfhdksjhgkdj
}

EDIT3:

苦苦挣扎:

return urlHelper.Action(actionName, controllerName, routeValues, protocol);

显然需要转换为IHtmlString ??

EDIT4:

    public static String Action(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues, string protocol, bool isHashRequired )
{

    RouteValueDictionary rvd = new RouteValueDictionary(routeValues);
    if (isHashRequired)
    {
        string token = "FDSKGLJDS";
        rvd.Add("urltoken", token);
    }
     return urlHelper.Action(actionName, controllerName, rvd, protocol); //rvd is incorrect I believe
}

EDIT5

    return urlHelper.Action(actionName, controllerName, rvd, protocol,null);

其中

rvd是RouteValueDictionary   hostname为null。

...谢谢

1 个答案:

答案 0 :(得分:3)

您应该考虑修改路线

您已配置路由的位置添加如下内容:

routes.MapRoute(
  "hash",                                                            // Route name
  "{controller}/{action}/{id}/{hash}",                               // URL with parameters
  new { controller = "Home", action = "Index", id = "", hash = "" }  // Parameter defaults
);

并像这样使用URL.Action

myParm = "myTestParameterValue";
@Url.Action("Edit", "Order", new { id=item.Id, hash = myParm}, null);

您可以使用新的扩展方法类

轻松添加它
public static class MyExtensions
{
    public static IHtmlString ActionWithHash(this UrlHelper urlHelper, ....)
    {
         if (hashRequired)
         {
             routeParameters["hash"] = ...
         }
         return urlHelper.Action(...);
    }
}