【问题标题】:MVC Model is null after calling RedirectToAction调用 RedirectToAction 后 MVC 模型为空
【发布时间】:2012-05-04 23:09:57
【问题描述】:

我在完成 POST 操作后尝试 RedirectToAction 时遇到 NullReferenceException。这是我正在尝试的摘要:

应用程序发布后,如果应用程序有效,我希望客户端重定向到另一个视图路由)后续流程。

[HttpPost]
public ActionResult SubmitApplication(Application application)
{
    // Do stuff

    if (!ModelState.IsValid)
    {
        return View(application);
    }

    // Create and set variables for the next route

    return RedirectToAction("ApplicationReview", new
    {
        x = "foo",
        y = "bob"
    });
}

[HttpGet]
public ActionResult ApplicationReview(string x, string y)
{
    // Do stuff using x and y as keys

    return View();
}

SubmitApplication 视图中,我有类似于以下的代码,尽管它更详细。 RedirectToAction 被调用后,SubmitApplication 视图中的Model 对象为空并抛出异常。我可以理解为什么 SubmitApplication 视图作为重定向过程的一部分返回,我只是无法弄清楚为什么模型为空或如何设置它。最后,可能永远不会到达目标 Action,因为重定向从未真正发生过。

@if (Model.HasSomething)
{ 
    ...
}

我做错了什么?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    RedirectToAction 中的第二个参数不是针对模型的,而是针对 routeValues 的。

    要临时维护重定向结果的状态,您需要将数据存储在 TempData 中。

    【讨论】:

    • 请注意,如果您使用 TempData,并且用户以某种方式刷新页面(例如 F5),则 TempData 项将消失。这就是为什么我发现 TempData 是 MVC 中最没有价值的东西,除非在非常罕见的情况下,否则永远不应该使用它。如此罕见,以至于我什至想不出使用它的理由而不存在这个问题。
    • 顺便说一下,路由值会将值添加到查询环(如果它们未在路由中定义),因此它们将绑定到被调用操作的参数列表。
    • @MystereMan:我认为 TempData 在您执行 Post-Redirect-Get 并需要向目标操作发送一些数据时很有用。
    • 不,不是。同样,如果您在获取后刷新页面,您在 TempData 中发送的数据将消失,因此刷新将不会具有您在 TempData 中发送的状态。它有效,但不可靠。
    • @Tuan 我明白了,我试图传入目标路由而不是模型所需的值。再说一次,我想我也可能做错了
    【解决方案2】:

    当你说After the RedirectToAction is called the Model object is null and throws an exception. 时,我有点不清楚你的意思,因为在代码中你显示你在调用 RedirectToAction 后没有对模型做任何事情。

    您的意思是 Model 在您的 ApplicationReview 视图中为空吗?

    编辑:

    空引用异常表示正在取消引用变量。没有任何东西可以取消对该模型的引用。也许如果您发布堆栈跟踪会有所帮助。

    【讨论】:

    • 抱歉没有更清楚。 SubmitApplication 操作方法执行后,在 SubmitApplication 视图中抛出异常。据我所知,ApplicationReview Action 从未真正被调用过,因此相关的 View 永远不会被渲染。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2019-09-26
    • 2016-05-16
    • 2022-10-08
    相关资源
    最近更新 更多