Есть ли способ включить идентификатор фрагмента при использовании Asp.Net MVC ActionLink, RedirectToAction и т. д.?

StackOverflow https://stackoverflow.com/questions/5628

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top