我在控制器上有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方法时,我会得到一个水合模型。
答案 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?
吗?