有没有办法在使用Asp.Net MVC ActionLink,RedirectToAction等时包含片段标识符?

Ric*_*cky 21 asp.net-mvc

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

调试:IE6 + SSL + AJAX + post form = 404错误#5626

有没有办法用MVC中的任何内置方法来做到这一点?或者我是否必须推出自己的HTML助手?

Lor*_*zCK 18

正如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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return RedirectToAction("MyAction", "MyController")
       .AddFragment("fragment-name");
Run Code Online (Sandbox Code Playgroud)

这应该正确生成URL.

  • 这很棒.在MVC3中,`ActionLink`有一个重载,它允许你做一个片段,但不是`RedirectToAction`. (3认同)

Haa*_*ked 6

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