当使用Asp.Net MVC ActionLink,RedirectToAction等时,有没有一种方法可以包含片段标识符?

我想要一些链接来包含一个片段标识符。像本网站上的一些网址一样:

Debugging: IE6 + SSL + AJAX + post form = 404 error#5626

有没有办法与MVC中的任何内置方法做到这一点?或者我将不得不推出自己的HTML助手?

0

7 答案

@Dominic,

我几乎肯定的是,将其放入路由会导致路由问题。

@Ricky,

在MVC支持这一点之前,你可以稍微说一些关于如何制作路线的“老派”。例如,你可以转换:

<%= Html.ActionLink("Home", "Index") %>

成:

Home

或者你可以写你自己的帮手,它本质上是一回事。

0
额外
我尝试了ASP.NET MVC Preview 3的路由目标,并且路由没有问题。所以,尽管你“几乎是积极的”,但对你来说会有什么问题进行阐述会很有帮助。
额外 作者 Dominic Cooney,

正如Brad Wilson所写,你可以通过串联字符串在视图中建立自己的链接。但是为了将一个片段名称附加到通过RedirectToAction(或类似的)生成的重定向,您需要如下所示:

public class RedirectToRouteResultEx : RedirectToRouteResult {

    public RedirectToRouteResultEx(RouteValueDictionary values)
        : base(values) {
    }

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values)
        : base(routeName, values) {
    }

    public override void ExecuteResult(ControllerContext context) {
        var destination = new StringBuilder();

        var helper = new UrlHelper(context.RequestContext);
        destination.Append(helper.RouteUrl(RouteName, RouteValues));

        //Add href fragment if set
        if (!string.IsNullOrEmpty(Fragment)) {
            destination.AppendFormat("#{0}", Fragment);
        }

        context.HttpContext.Response.Redirect(destination.ToString(), false);
    }

    public string Fragment { get; set; }
}

public static class RedirectToRouteResultExtensions {
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) {
        return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) {
            Fragment = fragment
        };
    }
}

然后,在你的控制器中,你会打电话给:

return RedirectToAction("MyAction", "MyController")
       .AddFragment("fragment-name");

这应该正确生成URL。

0
额外
这很棒。在MVC3中, ActionLink 有一个重载,它允许你创建一个片段,但不是 RedirectToAction
额外 作者 kamranicus,
你,先生,是我的英雄。 :)
额外 作者 Matt DiTrolio,
0
额外

简短的回答是:不。在ASP.NET MVC Preview 3中,没有一种在动作链接中包含锚点的一流方法。与Rails的url_for:anchor不同,UrlHelper.GenerateUrl(以及使用它的ActionLink,RedirectToAction等)没有可让您对锚点进行编码的魔术属性名称。

正如你指出的那样,你可以推出自己的产品。这可能是最干净的解决方案。

Hackily,你可以在路由中包含一个锚点并在你的参数hash中指定值:

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}");
...
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%>

这将生成一个URL,如/ Home / Index /#foo。不幸的是,这对于显示在URL末尾的URL参数并不适用。因此,只有在所有参数都显示为URL路径组件的非常简单的情况下,这种攻击才可行。

0
额外
不起作用。 #被转换为%23。
额外 作者 jpbochi,

我们正在考虑在下一个版本中包含对此的支持。

0
额外
这是否会成为dev10发布的目标?
额外 作者 ajma,

这是一个客户端解决方案,但如果你有jQuery可用,你可以做这样的事情。

<script language="javascript" type="text/javascript">
    $(function() {
        $('div.imageHolder > a').each(function() {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>
0
额外

在MVC3中(可能更早的我没有检查过),你可以使用UrlHelper.GenerateUrl传递fragment参数。这是我用来包装功能性L的帮助程序方法

public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues)
{
    return UrlHelper.GenerateUrl(
        routeName: null,
        actionName: actionName,
        controllerName: controllerName,
        routeValues: new System.Web.Routing.RouteValueDictionary(routeValues),
        fragment: fragment,
        protocol: null,
        hostName: null,
        routeCollection: url.RouteCollection,
        requestContext: url.RequestContext,
        includeImplicitMvcValues: true /*helps fill in the nulls above*/
    );
}
0
额外
有点尴尬,但这是这里最好的答案。也许,其他人只是过时了。
额外 作者 jpbochi,