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

21
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

Мы смотрим включая поддержку этого в нашем следующем выпуске.

6
ответ дан 29 November 2019 в 21:17
поделиться

@Dominic,

я почти положителен, что помещение этого в маршруте вызовет проблемы маршрутизации.

@Ricky,

, Пока MVC не имеет поддержку этого, можно быть немного большим количеством "старой школы" о том, как Вы делаете свои маршруты. Например, можно преобразовать:

<%= Html.ActionLink("Home", "Index") %>

в:

<a href='<%= Url.Action("Index") %>#2345'>Home</a>

Или можно записать собственному помощнику, который делает по существу то же самое.

3
ответ дан 29 November 2019 в 21:17
поделиться

Короткий ответ: Нет. В 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.

1
ответ дан 29 November 2019 в 21:17
поделиться

Как писал Брэд Уилсон, вы можете создать свою собственную ссылку в своих представлениях, просто объединяя строки. Но чтобы добавить имя фрагмента к перенаправлению, сгенерированному с помощью 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.

18
ответ дан 29 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: