Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在使用Asp.Net MVC ActionLink、RedirectToAction等时,是否有方法包含片段标识符。?_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 在使用Asp.Net MVC ActionLink、RedirectToAction等时,是否有方法包含片段标识符。?

Asp.net mvc 在使用Asp.Net MVC ActionLink、RedirectToAction等时,是否有方法包含片段标识符。?,asp.net-mvc,Asp.net Mvc,我希望一些链接包含一个片段标识符。与此网站上的某些URL类似: 5626 有没有一种方法可以使用MVC中的任何内置方法来实现这一点?或者我必须推出自己的HTML助手吗?简短的回答是:不可以。在ASP.NET MVC Preview 3中,没有一流的方法可以在动作链接中包含锚定。与Rails的url_for:anchor不同,UrlHelper.GenerateUrl(以及使用它的ActionLink、RedirectToAction等)没有一个神奇的属性名来对锚进行编码 正如你所指出的,你可以自

我希望一些链接包含一个片段标识符。与此网站上的某些URL类似:

5626


有没有一种方法可以使用MVC中的任何内置方法来实现这一点?或者我必须推出自己的HTML助手吗?

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

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

通常,您可以在路由中包含一个锚点,并在参数散列中指定值:

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

这将生成一个类似于/Home/Index/#foo的URL。不幸的是,这不能很好地处理URL参数,这些参数出现在URL的末尾。因此,只有在所有参数都以URL路径组件的形式出现的非常简单的情况下,这种攻击才可行。

我们正在考虑在下一版本中包括对该组件的支持。

@Dominic

我几乎可以肯定的是,把它放在路线上会导致路线问题

@瑞奇

在MVC支持这一点之前,您可以对如何制定路线更为“老派”。例如,您可以转换:

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

进入:



或者,您可以编写自己的帮助程序来完成基本相同的任务。

正如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。

这是一个客户端解决方案,但是如果您有jquery可用,您可以这样做

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

$(函数(){
$('div.imageHolder>a')。每个(函数(){
$(this.attr('href',$(this.attr('href')+'#tab works');
});
});
在MVC3中(可能之前我没有检查),您可以使用UrlHelper.GenerateUrl传递片段参数。这里有一个我用来包装functional的helper方法

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

MVC5支持片段标识符。请参阅和中的
ActionLink
的重载。

我使用ASP.NET MVC Preview 3在路由中尝试了目标,路由没有问题。因此,尽管您“几乎是肯定的”,但详细说明将出现哪些问题对您来说是很有用的。这将在dev10中发布吗?这很好。在MVC3中,有一个到
ActionLink
的重载,允许您执行片段,但不允许执行
RedirectToAction
。有点尴尬,但这是最好的答案。也许,其他的都过时了。
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*/
    );
}