Asp.net mvc 在使用Asp.Net MVC ActionLink、RedirectToAction等时,是否有方法包含片段标识符。?
我希望一些链接包含一个片段标识符。与此网站上的某些URL类似: 5626Asp.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等)没有一个神奇的属性名来对锚进行编码 正如你所指出的,你可以自
有没有一种方法可以使用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*/
);
}