繁体   English   中英

从控制器传递数据以查看MVC时,Null TempData

[英]Null TempData when passing data from controller to view MVC

我在将数据传递到视图的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任何值都将被丢弃 ,称为“正常读取”。

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

  1. 请求=> ActionResult(ControllerToView)
  2. 设置TempDataDictionary
  3. 响应=> RedirectResult
  4. 如果没有用于保留数据的KeepPeek方法,则Request => ViewResult ==> TempDataDictionary内容可以在此处丢弃
  5. 响应=>视图( 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>
}

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

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

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

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

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

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

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

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

参考文献:

在ASP.NET MVC中使用Tempdata-最佳实践

何时使用ViewBag,ViewData或TempData

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM