2010-10-25 92 views
33

我目前在我的控制器中有一個方法,它接受一個表單集合,保存數據,然後將數據顯示在「詳細信息」頁面中。目前,該代碼目前看起來是這樣的:ASP.NET MVC重定向模型

[HttpPost] 
public ActionResult Create(PersonModel person)<br> 
{ 
    if (person.IsValid()) 
    { 
     person.additionalData = "Person created successfully"; 
     return View("Details", person); 
    } 
} 

的問題是,在返回的詳細信息以這種方式查看保留URL的mysite /人/製作 - 我非常希望的URL是mysite的/人/詳細資料/ IdGoesHere。

我確定這一定是可能的。顯然,我可以使用Response.Redirect,但是這不允許我將模型傳遞給視圖。據我所知,我無法使用RedirectToAction傳遞模型?

感謝您的幫助。

編輯:確認 - 由創建操作生成的模型不同於由詳細信息操作創建的默認模型。因此,直接重定向到Action並傳遞Id不起作用,因爲產生的模型不正確。爲了提供更多上下文,創建操作中的模型包含一個附加值,說明「人員已成功創建」,如果我重定向到「詳細信息」操作,則此消息不存在於模型中。

回答

29

user460667,

直接從自己的應用程序:

public ActionResult Create(Booking item) 
{ 
    if (ModelState.IsValid) 
    { 
     int newID = _tasks.Create(item); 
     // NEW section to emulate model being populated for use in Details view 
     TempData["additionalData"] = "Person created successfully"; 
     return RedirectToAction("Details", new { id = newID }); 
    } 
    else 
    { 
     return View(); 
    } 
} 

然後,無法將您的詳細操作是這樣的:

public ActionResult Details(int id) 
{ 
    var item = _tasks.GetByKey(id); 
    var additionalData = TempData["additionalData"]; 
    if(item != null) { 
     if(additonalMessage!=null) 
     { 
      item.additionalData = additionalData; 
     } 
     return View(item); 
    } 
    else 
     return View("Notfound"); 
} 

不能你採納一個類似的方法??

[編輯]

用戶,重新您編輯。你能不能按照慣例做重定向,並且有一個標記(在上面的tempdata上)給出這個消息? tempadata標誌只會在Create操作中設置,因此只會在創建一個新的'person'對象時發生。因此,詳細的行動將永遠只能表明它作爲創建行動的後果

+3

這是要走的路。如果tempdata中的簡單消息不夠用,您可以將整個'PersonModel'對象放入tempdata中,並將其從'Details'操作方法中的tempdata中取回。 – Charlino 2010-10-25 20:07:35

6

這應該帶你到詳細模型,傳遞它的ID。

return RedirectToAction("Details", new { id = person.PersonID }); 
+0

嗨,這個問題是,默認的行動不會使用相同的數據填充模型,就好像它通過'創建'行動。看其他答案,最好的解決方案似乎是TempData。 – user460667 2010-10-25 12:12:53

+1

您可以創建一個InitializeModel方法,爲您分配所有的數據。 – 2010-10-25 12:18:19

6

記住,您還可以採取MvcContrib的類型安全的方法,並做

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID)); 
+0

如果你不想要MvcContrib的全部功能,你可以在https://github.com/uglybugger/MvcNavigationHelpers使用MvcNavigationHelpers – 2017-03-04 04:07:17

8

您可以補充什麼已經提供(使用RedirectToAction和路由)配合使用的TempData

[HttpPost] 
public virtual ActionResult Create(IEnumerable<OrderItem> orderItems) 
    { 
     if (orderItems.Count() == 0) 
     { 
      return RedirectToAction("NoOrderItems"); 
     } 
     else 
     { 
      TempData["orderItems"] = orderItems; 
      return RedirectToAction("Confirm"); 
     } 
    } 

    [HttpGet] 
    public virtual ActionResult Confirm() 
    { 
     var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>; 
     if (orderItems == null || orderItems.Count() == 0) 
     { 
      this.InvokeHttp404(ControllerContext.HttpContext); 
     } 

     return View(orderItems); 
    } 

我用這個,我可能不希望在後續請求中重新創建或在數據庫中持續相當,但還沒有項目。有了這個,我不需要在我的視圖中進行空檢查,因爲確認頁面只有在有數據時才能「獲得」。

+0

偉大的代碼我還沒有測試過它,但很快就必須在這樣的組件上工作,我有一個問題,如果我刷新頁面,它會工作或tempdata將過期 – 2017-07-25 04:57:25