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

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

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

===============>>#1 票数: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
        };
    }
}

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

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

这应该正确生成URL。

===============>>#2 票数:6 已采纳

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

===============>>#3 票数:4

在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*/
    );
}

===============>>#4 票数:3

@Dominic,

我几乎肯定将它放在路线中会导致路由问题。

@Ricky,

在MVC对此提供支持之前,您可以成为一个关于如何制作路线的“旧学校”。 例如,您可以转换:

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

成:

<a href='<%= Url.Action("Index") %>#2345'>Home</a>

或者你可以编写自己的帮助程序,基本上做同样的事情。

===============>>#5 票数:1

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

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

Hackily,您可以在路由中包含锚点并在参数哈希中指定值:

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

这将生成一个像/ Home / Index /#foo这样的URL。 不幸的是,这不适用于URL参数,这些参数出现在URL的末尾。 因此,只有在所有参数都显示为URL路径组件的非常简单的情况下,此hack才可用。

===============>>#6 票数:0

MVC 5支持片段标识符。请参阅https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspxhttps://msdn.microsoft.com上的 ActionLink重载。 /en-us/library/dd492938(v=vs.118).aspx

===============>>#7 票数:0

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

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

  ask by Ricky translate from so

未解决问题?本站智能推荐: