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

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

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

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

Ответы [ 7 ]

18 голосов
/ 07 августа 2009

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

5 голосов
/ 27 августа 2008

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

4 голосов
/ 25 августа 2011

В MVC3 (и, возможно, ранее я не проверял), вы можете использовать UrlHelper.GenerateUrl, передавая параметр фрагмента. Вот вспомогательный метод, который я использую, чтобы обернуть функциональность L

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*/
    );
}
3 голосов
/ 27 августа 2008

@ Dominic

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

@ Рики,

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

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

в

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

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

1 голос
/ 10 августа 2008

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

0 голосов
/ 11 мая 2015

Идентификаторы фрагментов поддерживаются в 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.

0 голосов
/ 21 июля 2011

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

<script language="javascript" type="text/javascript">
    $(function () {
        $('div.imageHolder > a').each(function () {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...