C# 使用TempData在控制器操作之间传递详细信息是否是错误的做法?
在某些情况下,我需要在控制器操作之间传递一个值C# 使用TempData在控制器操作之间传递详细信息是否是错误的做法?,c#,.net,asp.net-mvc,razor,C#,.net,Asp.net Mvc,Razor,在某些情况下,我需要在控制器操作之间传递一个值 将返回URL从视图传递到所有嵌套视图时。在 我的看法 @{ TempData["returnURL"] = Request.Url.AbsoluteUri; } 然后以与此类似的方式访问它(在我的真实版本I中) 检查键是否在TempData中,返回的URL是否为真实URL URL): 如果需要在第一页更改后继续(即搜索 页面->编辑页面->编辑分区页面)我再次添加它 TempData["returnURL"] = TempData["ret
@{
TempData["returnURL"] = Request.Url.AbsoluteUri;
}
然后以与此类似的方式访问它(在我的真实版本I中)
检查键是否在TempData中,返回的URL是否为真实URL
URL):
如果需要在第一页更改后继续(即搜索
页面->编辑页面->编辑分区页面)我再次添加它
TempData["returnURL"] = TempData["returnURL"];
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;
...
}
然后在另一个名为action controller的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);
}
我的问题是,这种做法真的很糟糕吗?从我对它的理解来看,我基本上是在使用TempData,就像会话cookie一样。有没有更好的方法来实现这一点,比如使用实际的cookie?我将这两种情况都更改为使用
Session
,这样我就不必一直按下TempData
值
public ActionResult Create()
{
Session["returnURL"] = Request.UrlReferrer.AbsoluteUri;
...
}
然后我像这样访问它
var returnURL = (Session["returnURL"] != null) ? Session["returnURL"].ToString()
: Url.Action("Index", "Home");
似乎好一点。您似乎正在使用
TempData
在站点的各个页面中流动状态;总的来说,我认为这是一种糟糕的做法
理想情况下,您将需要的任何即将出现的状态流到客户机,客户机将存储它(以某种JSON或其他形式)。然后,客户将其作为其操作的一部分返回给您,然后您将传回相应的状态,等等。;它更多地说明了HTTP应用程序的无状态性质。是的,我认为这通常是不好的做法。虽然ViewData dictionary方法快速且易于实现,但它可能会导致在编译时无法捕获的打字错误和错误。另一种方法是使用ViewModel模式,该模式允许您为需要在其中公开值或内容的特定视图使用强类型类。最终为您提供类型安全和编译时检查以及intellisense
我的第一个选择是使用视图模型。如果这不合适,那么使用会话状态就可以了。FYI-
FormCollection
不推荐使用。视图设置任何内容也是个坏主意。它在哪里说FormCollection不推荐使用?MSDN上没有提到这一点:。使用强类型模型是更好的做法。
var returnURL = (Session["returnURL"] != null) ? Session["returnURL"].ToString()
: Url.Action("Index", "Home");