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

在某些情况下,我需要在控制器操作之间传递一个值

  • 将返回URL从视图传递到所有嵌套视图时。在 我的看法

    @{
       TempData["returnURL"] = Request.Url.AbsoluteUri;
    }
    
    然后以与此类似的方式访问它(在我的真实版本I中) 检查键是否在TempData中,返回的URL是否为真实URL URL):

    如果需要在第一页更改后继续(即搜索 页面->编辑页面->编辑分区页面)我再次添加它

    TempData["returnURL"] = TempData["returnURL"];
    
  • 当我需要通过 查看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;
       ...
    }
    
    然后在另一个名为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");