ASP.NET MVC 3: как получить параметры, с которыми был вызван метод действия? - PullRequest
1 голос
/ 09 ноября 2011

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

public ActionResult Index(Int32? x, Int32? y, DateTime? z, NumberStyles n) {
this.RouteData.Values["x"] = x
this.RouteData.Values["y"] = y
this.RouteData.Values["z"] = z
this.RouteData.Values["n"] = n
return View();
}

Похоже, что это возможно для имен и значений каждого параметра без такого утомительного кода.

Иногда вы можете получить параметры, с которыми был вызван метод действия, посмотрев в RouteData, но это не всегда так, особенно если метод действия был вызван с помощью запроса ajax, параметры могут не отображаться в RouteData, и вместо этого отображаются в параметрах запроса.

То, что я ищу, это общий способ получить каждый параметр, который определен в сигнатуре метода действия во время выполнения, и получить фактический объект параметра, значение времени выполнения, а не просто строку. Более того, он должен работать независимо от того, как был вызван метод действия, может ли он быть результатом ChildActionExtensions.Action или обратного вызова ajax.

Параметры RouteData и Request, похоже, не имеют того, что я ищу.

1 Ответ

1 голос
/ 13 февраля 2012

Ваш пример кода устанавливает значения обратно в коллекцию RouteData. Вы пытаетесь передать параметры своему представлению, используя коллекцию RouteData? Это не то, для чего он существует, вы можете вместо этого использовать ViewBag.

Или создайте POCO, который содержит все ваши свойства, и пусть связыватель данных сделает всю работу (поэтому используйте @model YourType в вашем представлении и передайте один аргумент вашему представлению. Связыватель модели по умолчанию отобразит значения отдельных аргументов для вас).

Что касается коллекций входных значений, есть веская причина, по которой значение не может быть найдено последовательно в упомянутых вами коллекциях.

Возможно, уловка в том, чтобы уточнить, что происходит до того, как ваше действие будет вызвано. Аргументы вашего метода действия могут быть получены из нескольких источников. Например, это может быть от:

  1. Путь URL
  2. Строка запроса URL (например: в GET, параметры после знака вопроса?)
  3. отправленные данные формы
  4. Явные аргументы из другого действия

В приведенном выше примере кода коллекция RouteData будет содержать значение «x», только если у вашего маршрута есть совпадающее имя параметра.

Например: "{controller}/{action}/{x}". (это пользовательский маршрут, вытягивающий «х» из пути)

Если этого не сделать, значения будут разрешены с использованием связывателя модели по умолчанию и будут извлечены либо из параметров строки запроса, либо из данных POST, в зависимости от обстоятельств.

Значение маршрута будет иметь приоритет. Поэтому, если был применен указанный выше пользовательский маршрут, следующий URL:

http://www.example.com/Something/Index/1?x=2

вызовет ваше действие с x = 1 . Тогда 1 будет найдено в RouteData как извлеченное из URL-пути, а x = 2, найденное в Request.QueryString, будет проигнорировано.

Если вас интересует, как х получил свое значение, то вы должны принять во внимание все вышеперечисленное, чтобы вы знали, где искать. Существует также вопрос о том, какой маршрут применяется к запросу, но это совсем другая тема.

Все входные данные попадали на провод в виде текста ... это связыватель модели проверял подпись вашего действия и преобразовывал в указанные вами типы (везде, где это возможно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...