我想要一些包含片段标识符的链接。像本网站上的一些网址一样:
Debugging: IE6 + SSL + AJAX + post form = 404 error的#5626
有没有办法用MVC中的任何内置方法执行此操作?或者我是否必须推出自己的HTML助手?
答案 0 :(得分: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。
答案 1 :(得分:5)
我们正在考虑在下一版本中加入对此的支持。
答案 2 :(得分:4)
在MVC3中(可能更早,我没有检查过),您可以使用传递fragment参数的UrlHelper.GenerateUrl。这是我用来包装functionalL
的辅助方法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*/
);
}
答案 3 :(得分:3)
@Dominic,
我几乎肯定将它放在路线中会导致路由问题。
@Ricky,
在MVC对此提供支持之前,你可以成为一个关于如何制作路线的“老派”。例如,您可以转换:
<%= Html.ActionLink("Home", "Index") %>
成:
<a href='<%= Url.Action("Index") %>#2345'>Home</a>
或者你可以编写自己的助手,它们基本上是一样的。
答案 4 :(得分: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才可用。
答案 5 :(得分:0)
这是一个客户端解决方案,但如果你有jquery可用,你可以做这样的事情。
<script language="javascript" type="text/javascript">
$(function () {
$('div.imageHolder > a').each(function () {
$(this).attr('href', $(this).attr('href') + '#tab-works');
});
});
</script>
答案 6 :(得分:0)
MVC 5支持片段标识符。请参阅https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx和https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx上的ActionLink
重载。