【问题标题】:redirectToAction results in null modelredirectToAction 导致空模型
【发布时间】:2010-03-29 17:08:35
【问题描述】:

我在控制器上有 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 方法时,我得到一个空模型。当通过它的 url 直接调用 Accounting 方法时,我得到一个水合模型。

【问题讨论】:

  • 你使用的是什么版本的 MVC?
  • MVC2 RTM 我相信,我如何验证应用程序实际上使用了正确的 MVC2 CTP/Beta/RTC/RTC2 等?
  • 关注这篇博文,它应该会告诉你如何诊断你的应用正在使用哪个版本:bradwilson.typepad.com/blog/2010/03/…

标签: asp.net-mvc


【解决方案1】:

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

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

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

此路由指定 Calculators 控制器的默认操作将是“Accounting”而不是 Index。

【讨论】:

  • 好吧,这个想法是在我拥有更多计算器而不仅仅是一个计算器之前,这是一种临时解决方法。添加路由对我来说比在控制器中做它更难维护,然后当我有更好的事情要做时更改索引控制器。
  • 我能理解。另外,我已经能够在我自己的一个项目中使用它,而无需任何特殊配置,所以这也应该对你有用。会计视图是否是强类型的(即它是否在顶部有类似 Inherits="System.Web.Mvc.ViewPage" 的内​​容)?
【解决方案2】:

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

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

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

或者在您的操作方法中,您也可以调用 return View("Accounting", new 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?

【讨论】:

  • 如果我希望索引操作只是移交给另一个操作,为什么我需要在索引操作中提供模型?
  • 如果是这种情况,您是否尝试过仅返回会计结果?类似:返回会计();在索引操作方法中。 (只是猜测,我自己还没试过)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2012-12-07
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多