Передача объекта в RedirectToAction - PullRequest
21 голосов
/ 29 сентября 2011

Я хочу передать объект в RedirectToAction. Это мой код:

RouteValueDictionary dict = new RouteValueDictionary();
            dict.Add("searchJob", searchJob);
            return RedirectToAction("SearchJob", "SearchJob", dict);

где searchJob - это экземпляр SearchJob. Но я не получаю данные о методе действия SearchJob. Вместо этого я получаю строку запроса searchJob = Entity.SearchJob. Пожалуйста, помогите мне. Что я делаю не так?

Ответы [ 4 ]

37 голосов
/ 29 сентября 2011

Нельзя передавать классы таким перенаправленным действиям. Перенаправление осуществляется с помощью URL. Url является строкой, поэтому он не может содержать классы ( сериализация объектов в URL здесь действительно не логична )

Вместо этого вы можете использовать TempData

TempData["searchJob"] = searchJob;
return RedirectToAction ...;

и в действии перенаправлен

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ;

После выполнения приведенного выше кода TempData больше не будет содержать searchJob. TempData обычно используется для однократного чтения.

Но мне не нравится путь выше. Если бы я был на вашем месте и хотел бы искать вакансии по имени , я бы добавил параметры маршрута, такие как

RouteValueDictionary dict = new RouteValueDictionary();
dict.Add("searchJobName", searchJob.JobName);

и получить его к действию через параметр

public ActionResult SearchJob(string searchJobName)
{
... do something with the name
}

Таким образом, вы получите более удобный для пользователя и удобный для HTTP URL-адрес, а с точки зрения действия он получит все необходимые параметры извне. Это лучше для тестирования, обслуживания и т. Д.

19 голосов
/ 09 августа 2012

Вы можете попробовать:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob)

Передача объекта searchJob в конструктор RouteValueDictionary приведет к разложению объекта searchJob и передаче каждого свойства класса SearchJob в качестве значения маршрута верхнего уровня.

При использовании подшивки модели по умолчанию действие определяется как:

public ActionResult SearchJob(SearchJob searchJob)

Получит полностью повторно гидратированный SearchJob объект.

0 голосов
/ 30 сентября 2011

Вы не можете передавать классы в метод RedirectToAction, если вы хотите передать весь объект в строке запроса или через POST, вы можете сериализовать объект, используя XML или JSON, и десериализовать объект в контроллере-получателе.Если вы используете этот подход, будьте осторожны с размером сериализованного объекта.

0 голосов
/ 29 сентября 2011

Попробуйте использовать Постраничное размещение Вы можете определить тип страницы Prevoiuse и использовать его в качестве объекта.

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