ASP.NET MVC — получить URL-адрес текущего действия, который не включает переданный идентификатор

У меня есть действие, в котором я хочу перехватить любой возможный целочисленный идентификатор и поместить его за хешем. (У меня есть Javascript, который обрабатывает идентификатор). Я делаю этот дополнительный шаг только ради таких URL-хакеров, как я, которые могут забыть о моем соглашении ставить хэш перед идентификатором.

Вот мои действия:

public ActionResult Edit(int? id)
{
    if (id != null) return Redirect(Url.Action("Edit") + "/#" + id);

    return View();
}

Проблема в том, что метод Url.Action сохраняет переданный идентификатор. Url.Action("Edit") возвращает "{controller}/Edit/{id}". Я хочу, чтобы он просто возвращал "{controller}/Edit"! (И мой код использует дополнительный "/#{id}").

Например, запрос на этот URL:

http://localhost:2471/Events/Edit/22

перенаправляет на этот URL:

http://localhost:2471/Events/Edit/22/#22

когда я хочу, чтобы он перенаправлялся на этот URL:

http://localhost:2471/Events/Edit/#22

Я разочарован. Кто-нибудь знает, как получить URL-адрес текущего действия, который не включает переданный идентификатор?


person Roy Tinker    schedule 11.12.2009    source источник
comment
Я нашел обходной путь. Замените Url.Action(Edit) на Url.Action(blahblah).Replace(blahblah,Edit).   -  person Roy Tinker    schedule 11.12.2009


Ответы (3)


Один из способов сделать это — определить маршрут для действия контроллера, например, маршрут будет определен как «{контроллер}/{действие}/». Затем используйте что-то похожее на следующее, чтобы создать фактический URL-адрес:

Url.RouteUrl("MyRoute") + "#" + id

Не лучший метод, но работает. Возможно, когда-нибудь Microsoft добавит в маршрутизацию поддержку фрагментов.

person Chris Shaffer    schedule 11.12.2009

Я не совсем уверен, но не могли бы вы использовать метод RedirectToAction?

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.redirecttoaction.aspx

person John Boker    schedule 11.12.2009
comment
Смотрите мои комментарии к ответу Криса Шаффера - это URL-кодирование #. - person Roy Tinker; 11.12.2009

Я не уверен на 100% (и у меня нет моей машины для тестирования), но я думаю, что вы можете передать хэш в параметре id, и это сработает... например:

Url.Action("Edit", "Events", new { id = "#" + id });

или вы можете использовать RedirectToAction() таким же образом.

Альтернативой может быть определение Route {controller}/{Action}/#{id}, а затем использование вместо этого Url.Route().

person Chris Shaffer    schedule 11.12.2009
comment
Хм, близко, но это URL-кодирование #. Таким образом, перенаправление идет на /Events/Edit/%2322. - person Roy Tinker; 11.12.2009
comment
Я также попытался определить маршрут к {controller}/{action}/#{id}, но он снова кодирует URL-адрес #. - person Roy Tinker; 11.12.2009
comment
D'oh, не думал о кодировке URL. Я полагаю, что моим последним предложением будет определение маршрута, который вообще не включает идентификатор, с которым вы могли бы объединиться; например, направьте {controller}/{Action}/, затем добавьте #id, как вы уже сделали. - person Chris Shaffer; 11.12.2009
comment
Да, это работает. Спасибо. Отредактируйте свой ответ, и я приму его. - person Roy Tinker; 11.12.2009
comment
Вместо этого я добавил новый ответ - решил, что таким образом этот разговор не будет бессмысленным, плюс люди могут увидеть способ НЕ делать это :) - person Chris Shaffer; 11.12.2009