使用TempData在控制器动作之间传递细节是不好的做法吗?
本文关键字:细节 控制器 TempData 之间 使用 | 更新日期: 2023-09-27 18:10:01
在某些情况下,我需要在控制器动作之间传递一个值。
-
当从视图传递一个returnUrl给所有嵌套视图时。在视图
@{ TempData["returnURL"] = Request.Url.AbsoluteUri; }
,然后以类似的方式访问它(在我的实际版本中)检查键是否在TempData中,并且returnURL是否为实值URL):
return Redirect(TempData["returnURL"].ToString());
如果它需要在第一页更改后继续(即搜索)page -> Edit page -> Edit Section page)我再添加一次
TempData["returnURL"] = TempData["returnURL"];
-
当我需要从一个控制器动作通过a传递值时视图到另一个由ajax调用的控制器动作,例如:
public ViewResult Index(FormCollection form) { var model = new GridColumnChooserViewModel(); //Select deleted/not deleted rows if (form.HasKeys()) model.ShowRows = (form["deletedDropDown"] == null) ? "Active" : GetOptionByName(form["deletedDropDown"]); TempData["ShowRows"] = model.ShowRows; ... }
然后在另一个ajax调用的动作控制器中访问它:
public JsonResult GetData() { //Select deleted/not deleted rows var showRows = (TempData.ContainsKey("ShowRows") && TempData["ShowRows"] == null) ? "Active" : GetOptionByName(TempData["ShowRows"].ToString()); //refresh tempdata showrows so it is there for next call TempData["ShowRows"] = model.ShowRows; return this.GetDataSource(showRows); }
是的,我想说这通常是不好的做法。虽然ViewData字典方法快速且相当容易实现,但它可能导致在编译时无法捕获的错别字和错误。另一种选择是使用ViewModel模式,它允许您为需要在其中公开值或内容的特定视图使用强类型类。最终为您提供类型安全和编译时检查以及智能感知。
我的第一选择是使用视图模型。
似乎你正在使用TempData
通过您的网站的各个页面流动状态;总的来说,我认为这是一种不好的做法。
理想情况下,您可以将需要的任何即将到来的状态流到客户端,并且客户端将存储它(以某种JSON或其他形式)。然后,客户端会将其返回给你作为其操作的一部分,然后你会传回适当的状态,等等;
我把这两种情况都改为使用Session
,这样我就不必一直把TempData
的值推到
public ActionResult Create()
{
Session["returnURL"] = Request.UrlReferrer.AbsoluteUri;
...
}
然后像这样访问
var returnURL = (Session["returnURL"] != null) ? Session["returnURL"].ToString()
: Url.Action("Index", "Home");
看起来好多了