Есть ли способ включить идентификатор фрагмента при использовании Asp.Net MVC ActionLink, RedirectToAction и т. д.?
-
08-06-2019 - |
Вопрос
Я хочу, чтобы некоторые ссылки включали идентификатор фрагмента.Как и некоторые URL-адреса на этом сайте:
Отладка:IE6 + SSL + AJAX + форма сообщения = ошибка 404#5626
Есть ли способ сделать это с помощью любого из встроенных методов MVC?Или мне придется использовать свои собственные помощники HTML?
Решение
Мы рассматриваем возможность включения этой поддержки в наш следующий выпуск.
Другие советы
Как писал Брэд Уилсон, вы можете создать собственную ссылку в своих представлениях, просто объединяя строки.Но чтобы добавить имя фрагмента к перенаправлению, созданному с помощью 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-адрес.
В MVC3 (и, возможно, раньше я не проверял) вы можете использовать UrlHelper.GenerateUrl, передавая параметр фрагмента.Вот вспомогательный метод, который я использую для переноса функциональности.
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*/
);
}
@Доминик,
Я почти уверен, что добавление этого в маршрут вызовет проблемы с маршрутизацией.
@Рики,
Пока у MVC нет такой поддержки, вы можете придерживаться более «старой школы» в построении маршрутов.Например, вы можете конвертировать:
<%= Html.ActionLink("Home", "Index") %>
в:
<a href='<%= Url.Action("Index") %>#2345'>Home</a>
Или вы можете написать свой собственный помощник, который делает по сути то же самое.
Краткий ответ:Нет.В 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" })%>
Это создаст URL-адрес типа /Home/Index/#foo.К сожалению, это не очень хорошо сочетается с параметрами URL-адреса, которые появляются в конце URL-адреса.Таким образом, этот хак работоспособен только в очень простых случаях, когда все ваши параметры отображаются как компоненты URL-пути.
Это решение на стороне клиента, но если у вас есть jquery, вы можете сделать что-то вроде этого.
<script language="javascript" type="text/javascript">
$(function () {
$('div.imageHolder > a').each(function () {
$(this).attr('href', $(this).attr('href') + '#tab-works');
});
});
</script>
Идентификаторы фрагментов поддерживаются в MVC 5.Видеть ActionLink
перегрузки в https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx и https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.