Як отримати поточний ідентифікатор маршруту в поданні з 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.