redirectToAction导致null模型

时间:2010-03-26 19:45:38

标签: asp.net-mvc

我在控制器上有2个动作:

public class CalculatorsController : Controller
{
    //
    // GET: /Calculators/

    public ActionResult Index()
    {
        return RedirectToAction("Accounting");
    }


    public ActionResult Accounting()
    {
        var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants();
        Debug.Assert(combatants != null);
        var bvm = new BalanceViewModel(combatants);
        Debug.Assert(bvm!=null);
        Debug.Assert(bvm.Combatants != null);
        return View(bvm);
    }

}

调用Index方法时,我会得到一个null模型。当通过它的url直接调用Accounting方法时,我会得到一个水合模型。

2 个答案:

答案 0 :(得分:1)

这不是解决方法而是解决方法。我不知道为什么你得到一个null模型,因为它看起来应该工作。事实上,当我自己尝试时,我可以确认你所看到的行为。 [编辑:我在我的初始测试代码中发现了一个导致我自己的null模型的缺陷。现在这已得到纠正,我的测试使用RedirectToAction可以正常工作。] 如果有理由,我不知道它是不是最重要的。

现在为解决方法...我假设你这样做,因为默认路由将所有流量发送到http://www.domain.com/Calculators到“索引”。那么为什么不创建这样的新路线:

routes.MapRoute(
  "Accounting",
  "Calculators/{action}/",
  new { controller = "Calculators", action = "Accounting" }
);

此路线指定计算器控制器的默认操作将是“会计”而非索引。

答案 1 :(得分:1)

您对行动会计的看法需要一个模型。 (BalanceViewModel)。索引操作方法没有BalanceViewModel的实例。

有很多方法可以解决这个问题。在您的View(aspx页面)中,您可以检查空值...

或者在索引操作方法中,您创建一个BalanceViewModel的新实例并将其存储在TempData中,然后在模型为null时在视图中检索它。

或者在您的操作方法中,您还可以调用返回视图(“会计”,新的BalanceViewModel()),而不是使用重定向操作。

编辑:示例代码 - 如果您想分享这个功能,请创建一个这样的私有方法:

public class CalculatorsController : Controller {
    // GET: /Calculators/
    public ActionResult Index() {
        return View(GetBalanceViewModel());
    }

    public ActionResult Accounting() {
        return View(GetBalanceViewModel());
    }

    private BalanceViewModel GetBalanceViewModel() {
        var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants();
        Debug.Assert(combatants != null);
        var bvm = new BalanceViewModel(combatants);
        Debug.Assert(bvm != null);
        Debug.Assert(bvm.Combatants != null);
        return bvm;
    }
}

你见过这个Question?

吗?