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

Я хочу, чтобы некоторые ссылки включали идентификатор фрагмента. Как и некоторые URL-адреса на этом сайте:

Отладка: IE6 + SSL + AJAX + почтовая форма = ошибка 404 # 5626

Есть ли способ сделать это с помощью любого из встроенных методов в MVC? Или я должен был бы свернуть моих собственных помощников HTML?

8.08.2008 03:54:08
7 ОТВЕТОВ
РЕШЕНИЕ

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

6
27.08.2008 16:18:45
это будет целью для релиза в dev10?
ajma 19.05.2009 07:59:22

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

1
19.05.2009 03:55:19

@Dominic,

Я почти уверен, что внесение этого в маршрут вызовет проблемы с маршрутизацией.

@Ricky,

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

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

в:

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

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

3
27.08.2008 16:47:21
Я пробовал цели в маршрутах с ASP.NET MVC Preview 3, и не было никаких проблем с маршрутизацией. Поэтому, хотя вы «почти уверены», вам было бы полезно уточнить, какие будут проблемы.
Dominic Cooney 19.05.2009 03:54:43

Как писал Брэд Уилсон, вы можете создать собственную ссылку в своих представлениях, просто объединяя строки. Но чтобы добавить имя фрагмента в редирект, сгенерированный через 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
7.02.2016 17:47:45
Это здорово. В MVC3 есть перегрузка, ActionLinkкоторая позволяет вам делать фрагмент, но нет RedirectToAction.
kamranicus 18.03.2011 04:30:50

Это решение на стороне клиента, но если у вас есть jquery, вы можете сделать что-то вроде этого.

<script language="javascript" type="text/javascript">
    $(function () {
        $('div.imageHolder > a').each(function () {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>
0
20.07.2011 21:48:56

В 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*/
    );
}
4
31.08.2015 16:18:43
Немного неловко, но это лучший из ответов здесь. Может быть, другие просто устарели.
jpbochi 25.09.2012 01:24:23

Идентификаторы фрагментов поддерживаются в MVC 5. См. ActionLinkПерегрузки на https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx и https://msdn.microsoft.com/ ru-ru / library / dd492938 (v = vs.118) .aspx .

0
11.05.2015 16:01:32