Мы смотрим включая поддержку этого в нашем следующем выпуске.
@Dominic,
я почти положителен, что помещение этого в маршруте вызовет проблемы маршрутизации.
@Ricky,
, Пока MVC не имеет поддержку этого, можно быть немного большим количеством "старой школы" о том, как Вы делаете свои маршруты. Например, можно преобразовать:
<%= Html.ActionLink("Home", "Index") %>
в:
<a href='<%= Url.Action("Index") %>#2345'>Home</a>
Или можно записать собственному помощнику, который делает по существу то же самое.
Короткий ответ: Нет. В ASP.NET Предварительный просмотр MVC 3 нет никакого первоклассного пути к включению привязки в ссылке действия. В отличие от url_for направляющих: привязка, UrlHelper. GenerateUrl (и ActionLink, RedirectToAction и так далее, которые используют его) не имеют волшебного имени свойства, которое позволяет Вам закодировать привязку.
, Как Вы указываете, Вы могли прокрутить свое собственное, которое делает. Это - вероятно, самое чистое решение.
Hackily, Вы могли просто включать привязку в маршрут и определить значение в Вашем хеше параметров:
routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}");
...
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%>
Это генерирует URL как/Home/Index/#foo. К сожалению, это не играет хорошо с параметрами URL, которые появляются в конце URL. Таким образом, этот взлом только осуществим при действительно простых обстоятельствах, где все Ваши параметры появляются как компоненты контура URL.
Как писал Брэд Уилсон, вы можете создать свою собственную ссылку в своих представлениях, просто объединяя строки. Но чтобы добавить имя фрагмента к перенаправлению, сгенерированному с помощью 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.