Як отримати поточний ідентифікатор маршруту в поданні з URL-адреси (ASP.NET MVC)


78

Як я можу отримати доступ до ідентифікатора з подання у поданні, яке повертається з такої URL-адреси, як / Controller / Action / 1 (якщо взяти маршрут за замовчуванням для контролера / дії / ідентифікатора)?

Я не хочу додавати його до словника ViewData на рівні дії під час обробки запиту.


2
Чому ви не хочете додати його до словника ViewData? Це механізм, який передбачений саме для того, що ви описуєте.
Адам Ральф,

Відповіді:


181

Я думаю, це те, що ви шукаєте:

<%=Url.RequestContext.RouteData.Values["id"]%>

+1 просто, ефективно і саме те, про що задавали питання!
Losbear

чому це десь належним чином не задокументовано в Інтернеті? grrrr
Айяш,

Ця відповідь не пояснює належним чином, як вона пом'якшує відображений XSS. Проголосовано проти.
CervEd

16

ViewData - це саме правильний спосіб зробити це.

Вашим іншим варіантом буде передача моделі, яка містить ідентифікатор, у подання.

Редагувати: Не знаючи, що саме ти робиш, важко дати більш конкретні поради. Навіщо потрібен ідентифікатор, а не будь-які інші дані моделі? Ваш контролер насправді надсилає лише поле Id до подання? Важко уявити, який сценарій.

Якщо значення ідентифікатора є справді єдиною інформацією про модель, яка передається у ваш подання, тоді ви можете використовувати сам ідентифікатор як модель. Тоді повернене значення вашого методу дії буде, View(id)і вам не потрібно буде використовувати ViewData.


На жаль, у View немає моделі. Щось ViewData["id"] = id;у мене просто не сидить. Я думаю, це той факт, що я використовую цей шаблон досить часто. Раз чи два, і я, мабуть, не заперечував би. Дякую.
JMS

3

Додавати його до даних перегляду - це правильно робити. Щодо того, як його додати, ви завжди можете додати користувальницький, ActionFilterякий захоплює його зі словника маршрутів і вписує у дані перегляду.


Мені подобається ця ідея, при належній перевірці нульового значення ви просто поставите це у верхній частині свого контролера, і ви зможете завжди покладатися на те, що він знаходиться там, коли він повинен бути.
Blair Scott

Або просто створіть приємний маленький клас ViewDataWrapper, який міг би керувати матеріалом "що робити, якщо це нуль". . .
Wyatt Barnett,

2

Ми можемо передати idяк Route DataабоQueryString , тому для підтримки обох я рекомендую такий спосіб:

var routeValues=Url.RequestContext.RouteData.Values;
var paramName = "id";
var id = routeValues.ContainsKey(paramName)?
         routeValues[paramName]:
         Request.QueryString[paramName];

2

Я думаю, ви можете безпосередньо використовувати в дії url Url.RequestContext.RouteData.Values ​​["id"]


1
Це спрацювало для мене. В ASP.NET Core це Url.ActionContext.RouteData.Values ​​["id"] на випадок, якщо хтось ще його шукає.
Енді,

2

Якщо ви використовуєте .NET Core

Використовуйте цей код

Url.ActionContext.RouteData.Values["id"]

2

Проста відповідь у бритві:

@Url.RequestContext.RouteData.Values["id"]

В ASP.NET Core

@Url.ActionContext.RouteData.Values["id"]

1

Лише мої два центи, але я завжди використовую моделі подання для передачі будь-яких даних у свої подання. Навіть якщо це так просто, як потрібність intподібного ідентифікатора.

Це робить доступ до цього значення тривіальним, оскільки MVC виконує всю роботу за вас.

Для чого я вартую, я зазвичай називаю свої моделі подання такими:

{Controller}{ViewName}ViewModel

Це допомагає організувати речі в масштабі.

Приклад:

// ~/ViewModels/HomeEditViewModel.cs
public class HomeEditViewModel
{
  public int Id { get; set; }
}

// ~/Controllers/HomeController.cs
public IActionResult Edit(int id)
{
  return View(new HomeEditViewModel() { Id = id });
}

// ~/Views/Home/Edit.cshtml
@model HomeEditViewModel

<h1>Id: @Model.Id</h1>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.