2015-08-24 1 views
2

В моем контроллере проекта ASP.NET MVC, у меня естьМожно ли передавать данные RedirectToAction без использования параметров в проекте ASP.NET MVC?

return RedirectToAction("CreatePerson", "Home") 

Это View представляет собой форму, которая создает человека, и это работает прекрасно. Однако я хочу перенаправитьToAction и предварительно заполнить форму данными, собранными из формы, которая создает пользователя для системы.

Как передать данные из формы CreateUser в форме CreatePerson?

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

Любая помощь в правильном направлении была бы принята с благодарностью.

+3

Вы должны сохранять 'Пользователь' в методе POST-метода CreateUser, а затем перенаправлять на« CreatePerson »и передавать« ID »только что созданного« Пользователь »- возвращать RedirectToAction (« CreatePerson "," Home ", new {ID = theUser.ID});', а затем в методе 'CreatePerson (int ID)' получите 'User' из базы данных. –

ответ

9

Вы не можете отправить данные с RedirectAction. Это потому, что вы выполняете перенаправление 301 и возвращаетесь к клиенту.

Поэтому лучше использовать TempData

Предполагая, что вы будете иметь модель для createperson со следующими свойствами:

public class CreatePersonData 
{ 
    public string name {get; set;} 
    public string address {get; set;} 
} 

Заливаем model и магазин в TempData

CreatePersonData person=new CreatePersonData(); 
person.name="SomeName"; 
person.address="SomeAddress"; 
TempData["person"]=person; 

return RedirectToAction("CreatePerson", "Home") 

Теперь при получении только получать его от tempdata и передать заполненный model к view

public ActionResult CreatePerson() 
{ 
    CreatePersonData person=new CreatePersonData() 
    var loadPerson= TempData["person"]; 
    person = loadPerson; 
    return View(person); 
} 

UPDATE

Как @StephenMuecke сделал точку потери данных с TempData вам может понадобиться использовать .Keep или .Peek с TempData, чтобы сохранить значение для будущих запросов

Ед.:

с .Peek

//PEEK value so it is not deleted at the end of the request 
var loadPerson= TempData.Peek("person"); 

или с .Keep

//get value marking it from deletion 
var loadPerson = TempData["person"]; 
//later on decide to keep it 
TempData.Keep("person"); 

или @Stephen сказал, просто передать id и выберите user из базы данных

Ex:

return RedirectToAction("CreatePerson", "Home", new { ID = User.ID }); 

Теперь в вашем CreatePersonActionResult просто получить его из БД, как показано ниже:

public ActionResult CreatePerson(int ID) 
{ 
    CreatePersonData person=new CreatePersonData(); 
    var user=(from u in tbl_user select u where u.ID=ID); 
    person.name=user.name; 
    person.address=user.address; 
    return View(person); 
} 

UPDATE 2

Вы можете комбинировать оба вышеуказанных подходов, как хранение данных в TempData и передачи ID с routeValues и проверьте, нет ли TempData, затем возврат к извлечению данных с использованием метода ID.

Ex:

public class CreatePersonData 
{ 
    public string Id{get; set;} 
    public string name {get; set;} 
    public string address {get; set;} 
} 

public ActionResult CreatePerson(int ID) 
{ 
    CreatePersonData person=new CreatePersonData(); 
    var loadPerson=(CreatePersonData)TempData.Peek("person"); //cast the object from TempData 
    if(loadPerson!=null && loadPerson.Id==ID) 
    { 
     person=loadPerson; 
    } 
    else 
    { 
     var user=(from u in tbl_user select u where u.ID=ID); 
     person.name=user.name; 
     person.address=user.address; 
    } 
    return View(person); 
} 
+1

Можете ли вы сделать это - да, но если вы - нет. 'TempData' длится только один раз, поэтому, если пользователь обновляет браузер, данные теряются. Вам также нужно нажать 'loadPerson'. И его метод GET - пользователь может перейти к нему из истории браузера или просто ввести его в адресную строку, что приведет к сбою ('TempData [" person "]' больше не существует или может быть совершенно другим объектом). По крайней мере, передайте идентификатор объекта в качестве параметра маршрута, поэтому, если объект «TempData» больше не существует или не соответствует указанному идентификатору, объект может быть извлечен из базы данных. –

+0

@StephenMuecke Обновленный ответ .. Исправьте меня, если что-то не так .. :) –

+1

Выглядит лучше (за исключением того, что вы до сих пор не привили объект TempData к типу, который требуется, но мы не знаем, какие типы в любом случае :). Вы, очевидно, можете комбинировать оба. Передайте идентификатор и «TempData», затем проверьте «TempData» - если его не «null» и его идентификатор совпадают с параметром, используйте его, иначе вызовите базу данных. –

-1

ДА

Вместо этого:

return RedirectToAction(actionName: "AddNews", routeValues: new { id = idtip }); 

вы можете сделать это: есть

return RedirectToAction("AddNews"); 
0

Многие Перегрузки для этого

protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues); 

То, что вы хотите сделать, это щелкните правой кнопкой мыши на том, что Meth од и View Definition, вы должны увидеть много перегруженных для него

// Summary: 
    //  Redirects to the specified action using the action name and route values. 
    // 
    // Parameters: 
    // actionName: 
    //  The name of the action. 
    // 
    // routeValues: 
    //  The parameters for a route. 
    // 
    // Returns: 
    //  The redirect result object. 
0

1- создать объект модели 2 вы можете использовать сессию для передачи параметра на другое действие, 3- затем поместить объект в viewbag AGG получить это на ваш взгляд

Смежные вопросы