我在将数据传递到视图的Controller中具有以下类:

public ActionResult ControllerToView(){
    ...
    TempData["example"] = "this is a message!";
    ...
    return Redirect("http://myViewPageLink");
}


在我的视图中,我试图通过以下方式访问TempData字典:

@if(myCondition){
    var test = TempData["example"];
    <p>@test</p>
}


始终满足“ myCondition”,但TempData词典始终为空。有什么想法吗?为了使TempData在视图中可用,我是否需要编写其他代码?

可能有用的信息是,在调用控制器方法之前,我向同一控制器中的另一个方法发出了ajax请求。

最佳答案

您应该知道TempDataDictionary用于短期实例。当下一个请求确实重定向到下一个视图时(适用于一次性消息),它的值在当前和后续请求期间可用。在后续请求完成后,您分配给TempDataDictionary的任何值都将被丢弃,称为“正常读取”。

这样您的当前请求就包含以下序列:


请求=> ActionResult(ControllerToView)
设置TempDataDictionary
响应=> RedirectResult
如果没有用于保留数据的TempDataDictionaryKeep方法,则Request => ViewResult ==> Peek内容可在此处丢弃
响应=>视图(TempDataDictionary为空)


因此,使用TempDataDictionary的正确方法是直接传递值以在当前请求中查看,或使用重定向到另一个控制器操作方法作为后续请求,如以下示例:

控制者

public ActionResult ControllerToView()
{
    ...
    TempData["example"] = "this is a message!";
    ...
    // returning view counts as providing response
    return View();
}


视图

@if (myCondition)
{
    var test = TempData["example"]; // showing message
    <p>@test</p>
}


上面示例的请求顺序如下:


请求=> ActionResult(ControllerToView)
设置TempDataDictionary
响应=>视图(TempDataDictionary不为空)


如果使用RedirectResult,然后尝试在不指定'next action'的情况下读取/显示TempData中的值,则该值被视为“正常读取”,并且在下一个请求中未保留。您可以使用“下一个动作”:KeepPeek(在视图或控制器动作中):

// Keep
var test = TempData["example"];
TempData.Keep("example");

// Peek
var test = TempData.Peek("example");


注意:如果您希望设置值在多个请求中保持不变,我强烈建议使用HttpSessionState

// set session state
Session["example"] = "[any value]";

// read in another request
var testing = Session["example"];


参考文献:

Using Tempdata in ASP.NET MVC - Best practice

When to use ViewBag, ViewData, or TempData

10-06 08:57