簡體   English   中英

Asp.net MVC將數據從一種方法傳遞到另一種方法然后傳遞到視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM