Asp.net mvc 跨帖子使用ViewData

Asp.net mvc 跨帖子使用ViewData,asp.net-mvc,Asp.net Mvc,我的视图有一个get和post方法,在get方法中我设置了几个ViewData对象的值。但是当我调用post方法时,这些ViewData对象将变为null。我需要在我的post方法中重置它们吗?这是我的密码: public ActionResult Index() { ViewData["afceaststandings"] = GetStandingsForGrid("2017", "AFC East"); ViewData["afccentralsta

我的视图有一个get和post方法,在get方法中我设置了几个ViewData对象的值。但是当我调用post方法时,这些ViewData对象将变为null。我需要在我的post方法中重置它们吗?这是我的密码:

public ActionResult Index()
    {
        ViewData["afceaststandings"] = GetStandingsForGrid("2017", "AFC East");
        ViewData["afccentralstandings"] = GetStandingsForGrid("2017", "AFC Central");
        ViewData["afcweststandings"] = GetStandingsForGrid("2017", "AFC West");

        return View("Index");
    }

[HttpPost]
    public ActionResult Index(QBRating qbm)
    {
        if (ModelState.IsValid)
        {
            string Result;
            double dblResult; 

            qbm.Completion = ((qbm.Completion - 30) * 0.05);

            if (qbm.Completion < 0)
            {
                qbm.Completion = 0;
            }

            if (qbm.Completion > 2.375)
            {
                qbm.Completion = 2.375;
            }

            qbm.Gain = ((qbm.Gain - 3) * 0.25);

            if (qbm.Gain < 0)
            {
                qbm.Gain = 0;
            }

            if (qbm.Gain > 2.375)
            {
                qbm.Gain = 2.375;
            }

            qbm.Touchdown = (qbm.Touchdown * 0.2);

            if (qbm.Touchdown > 2.375)
            {
                qbm.Touchdown = 2.375;
            }

            qbm.Interception = (2.375 - (qbm.Interception * 0.25));

            if (qbm.Interception < 0)
            {
                qbm.Interception = 0;
            }

            dblResult = Math.Round((((qbm.Completion + qbm.Gain + qbm.Touchdown + qbm.Interception) / 6) * 100), 2);

            Result = "QB Rating = " + Convert.ToString(dblResult);

            TempData["QBRating"] = Result;
        }

        //invalid - redisplay form with errors
        return View(qbm);
    }
public ActionResult Index()
{
ViewData[“afceaststandings”]=GetStandingsForGrid(“2017年”、“AFC东部”);
ViewData[“afccentralstandings”]=GetStandingsForGrid(“2017年”,“AFC中央”);
ViewData[“afcweststandings”]=GetStandingsForGrid(“2017年”、“AFC西部”);
返回视图(“索引”);
}
[HttpPost]
公共行动结果指数(qbm)
{
if(ModelState.IsValid)
{
字符串结果;
双dblResult;
qbm.Completion=((qbm.Completion-30)*0.05);
如果(qbm.Completion<0)
{
qbm.Completion=0;
}
如果(qbm.Completion>2.375)
{
qbm.完工=2.375;
}
qbm.增益=((qbm.增益-3)*0.25);
如果(qbm.Gain<0)
{
qbm.增益=0;
}
如果(qbm.Gain>2.375)
{
qbm.增益=2.375;
}
着陆高度=(着陆高度*0.2);
如果(qbm.触地>2.375)
{
qbm.接地=2.375;
}
qbm.拦截=(2.375-(qbm.拦截*0.25));
if(qbm.Interception<0)
{
qbm.拦截=0;
}
dblResult=数学回合(((qbm.完成+qbm.增益+qbm.着陆+qbm.拦截)/6)*100),2);
结果=“QB评级=”+转换为字符串(dblResult);
TempData[“校准”]=结果;
}
//无效-重新显示有错误的表单
返回视图(qbm);
}

是的,需要在POST控制器操作中将值重新分配给
ViewData
,因为
ViewData
不会在请求之间持久化


您可以使用来持久化请求的数据(在下次访问之前,它会持久化在ViewData中);默认()使用SessionState,因此,根据您使用的会话存储类型,您放入TempData的项目可能需要可序列化。

是。ViewData对象仅在一个请求的生存期内存在。因此,每个请求都必须重新设置所需的任何变量。

我觉得TempData在大多数情况下几乎毫无用处。如果在TempData中设置了某些内容,它将显示在下一页。但是,如果用户刷新页面,它就消失了,因此这只是一次快照。@MystereMan我不得不不同意-当您在POST controller操作中执行某种类型的操作后重定向到另一个操作时,TempData非常有用,在这种情况下,用于将某些数据仅从GET请求持久化到POST请求。如果用户最终没有发出POST请求,而是通过GET导航到其他地方,那么您可能希望删除TempData中的数据。但在大多数其他情况下,由于刷新限制,我觉得它不是很有用。但是,我的理解是,TempData现在会保留该数据,直到下次访问它为止,这意味着如果它们离开,它将保留在TempData中,直到会话结束。