Подтвердить что ты не робот

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

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

Отладка: сообщение IE6 + SSL + AJAX + post = 404 # 5626

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

В 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*/
    );
}

Ответ 4

@Dominic,

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

@Ricky,

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

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

в

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

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

Ответ 5

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

Ответ 6

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

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