![](/img/trans.png)
[英]Passing object from one action method to another in ASP.NET MVC 3
[英]Asp.net MVC passing data from one method to another method then to a view
通過將數據從一個ActionResult
傳遞到另一ActionResult
方法,我感到困惑。
這是關於什么的,我來描述一下,
我需要將值從一種方法傳遞給另一種,並且該值必須在我從另一種方法呈現的視圖上可用。
我在項目中看到的是這個(這是Edit,但是[ HttpPost
] Edit,它也重定向到Edit,但是帶有[ HttpPost
]的[ HttpGet
]):
TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
在[HttpGet]上做什么?
if (TempData["Success"] != null && TempData.ContainsKey("Success"))
ViewBag.Success = Convert.ToString(TempData["Success"]);
return View(model);
如您所見,[ HttpPost
]上的家伙TempData["Success"]
設置為True
; 然后重定向到[ HttpGet
]方法,並編寫下一個代碼:
if (TempData["Success"] != null && TempData.ContainsKey("Success"))
ViewBag.Success = Convert.ToString(TempData["Success"]);
return View(model);
所以,我想知道為什么它需要設置TempData
,后來基於對價值TempDate
讓我們設置值到ViewBag
,我不能只是設置ViewBag的價值我的第一次的ActionResult重定向之前,所以它可以提供同時在View連是否從HttpGet
操作結果渲染/調用視圖?
例如:
代替這個:
TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
我可以簡單地在HttpPost
寫嗎
ViewBag.Success = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
或者,這是需要用做TempData
,因為ViewBag
將不提供一個查看,如果我不把價值在它被重定向到一個視圖中的ActionResult,在這種情況下,它是HTTPGET,而不是HttpPost(所以這意味着我需要在HttpGet上設置ViewBag值?)
如果必須這樣做,我還可以使用兩個ViewBag,而不是ViewBag和TempData嗎?
為什么有人會這樣解決呢? 這是正確的方法還是什么?
有幾種技術可以實現Post / Redirect / Get模式。
TempData是為單個重定向傳遞信息的一種方法。 這種方法的缺點是,如果用戶在最終重定向頁面上單擊刷新(F5),則他將不再能夠提取數據,因為它將從TempData中刪除以用於后續請求。
其他兩種方法是查詢字符串參數和持久性。
我不能在重定向之前僅在第一個ActionResult上設置ViewBag的值,以便它也可以在View上使用
您不能,因為Http是無狀態的 。 因此,我們使用TempData來存儲臨時數據以便持久化Http請求。
為什么有人會這樣解決呢? 這是正確的方法還是什么?
就ASP.NET MVC而言,這種方法很好,因為我們沒有其他方法可以在Http請求之間保留臨時數據。
如果您發現自己經常這樣做,則可能要考慮使用警報擴展方法在烤面包機內顯示消息。
[HttpPost]
public ActionResult Edit(SettingModel model)
{
if (ModelState.IsValid)
{
...
return RedirectToAction("List")
.WithSuccess($"Setting was updated successfully.");
}
return View(model);
}
在這種情況下,無法使用First ViewBag
,因為您要進行重定向。 重定向意味着在特定的動作/控制器上發出完整的請求。 ViewBag
本質上僅用於在單個請求中將數據從操作傳遞到視圖,這意味着進行重定向將擦除ViewBag
保存的所有數據。 在這種情況下,我認為唯一的最佳方法是使用TempData
因為即使進行了重定向,它也會保留數據,但是當在同一控制器內進行重定向時 ,因此,如果您重定向到另一個控制器,最終將丟失數據在您的TempData
對象中注冊。
我可以看到您正在嘗試找到一種提醒用戶其他通知的方法,但是您可以在此處詳細了解該方法的答案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.