Передача объекта в RedirectToAction

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

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

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

4 ответа

Решение

Вы не можете передавать классы таким перенаправленным действиям. Перенаправление осуществляется с помощью 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 name
}

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

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

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

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

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

public ActionResult SearchJob(SearchJob searchJob)

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

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

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

Другие вопросы по тегам