当模型是字符串时,MVC无法找到正确的视图

时间:2013-11-22 22:41:12

标签: asp.net-mvc asp.net-mvc-5

我无法找到并返回正确的视图。

位于Account区域,AccountController,视图为ConfirmAccount.cshtml.,需要string模型。

我试过这些:

A)我试着像普通一样传递模型,视图名称与动作名称相匹配。

    public ActionResult ConfirmAccount(string id)
    {
        return View(id);
    }

这似乎不起作用,因为模型是一个字符串,它只是试图找到一个名为id的字符串。

B)所以我尝试指定视图名称,希望它能找到ConfirmAccount视图,并理解id是模型。

    public ActionResult ConfirmAccount(string id)
    {
        return View("ConfirmAccount", id);
    }

这个结果让我很困惑,它试图找到以下内容:

  

〜/地区/帐户/查看/帐户/ ConfirmAccount.aspx   〜/地区/客户/浏览/帐号/ ConfirmAccount.ascx   〜/地区/帐号/查看/共享/ ConfirmAccount.aspx   〜/地区/帐号/查看/共享/ ConfirmAccount.ascx   〜/查看/帐号/ ConfirmAccount.aspx   〜/ Views / Account / ConfirmAccount.ascx~ / Views / Shared / ConfirmAccount.aspx   〜/查看/共享/ ConfirmAccount.ascx   〜/地区/客户/浏览/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.master   〜/地区/帐号/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.master   〜/查看/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.master   〜/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.master   〜/地区/客户/浏览/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.cshtml   〜/地区/客户/浏览/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.vbhtml   〜/地区/帐号/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.cshtml   〜/地区/帐号/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.vbhtml   〜/查看/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.cshtml   〜/查看/帐号/ xNMf1HNl_2pLp-6MXpXl3g2If.vbhtml   〜/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.cshtml   〜/查看/共享/ xNMf1HNl_2pLp-6MXpXl3g2If.vbhtml

如果它正在寻找那里的cshtml页面,它正在寻找aspx / ascx页面是完美的,但由于某种原因它不是,而是试图通过id找到cs / vbshtml页面。有谁知道为什么会这样?

C)我能想到的第三个也是唯一的另一件事就是指定控制器名称。

    public ActionResult ConfirmAccount(string id)
    {
        return View("ConfirmAccount", "Account", id);
    }
  

〜/地区/帐户/查看/帐户/ ConfirmAccount.aspx   〜/地区/客户/浏览/帐号/ ConfirmAccount.ascx   〜/地区/帐号/查看/共享/ ConfirmAccount.aspx   〜/地区/帐号/查看/共享/ ConfirmAccount.ascx   〜/查看/帐号/ ConfirmAccount.aspx   〜/ Views / Account / ConfirmAccount.ascx~ / Views / Shared / ConfirmAccount.aspx   〜/查看/共享/ ConfirmAccount.ascx   〜/地区/客户/浏览/帐号/ Account.master   〜/地区/帐号/查看/共享/ Account.master   〜/ Views / Account / Account.master~ / Views / Shared / Account.master   〜/地区/客户/浏览/帐号/ Account.cshtml   〜/地区/客户/浏览/帐号/ Account.vbhtml   〜/地区/帐号/查看/共享/ Account.cshtml   〜/地区/帐号/查看/共享/ Account.vbhtml   〜/ Views / Account / Account.cshtml~ / Views / Account / Account.vbhtml   〜/ Views / Shared / Account.cshtml~ / Views / Shared / Account.vbhtml

这类似于最后一个,如果它在那里寻找cshtml,那么第一个是正确的路径,但由于某种原因它不是,我不明白为什么。在查找cshtml页面时,它会查找帐户而不是ConfirmAccount。

如何在我的模型是字符串的场景中正确返回ConfirmAccount.cshtml视图?

2 个答案:

答案 0 :(得分:1)

当您传入一个字符串作为唯一参数时,它使用重载View(string viewName)

您需要确保使用重载View(object model)

您可以将模型转换为object

return View((object)id);

我倾向于避免使用string模型,特别是出于这个原因。

请务必查看View的所有重载 - 例如:string, string viewName, masterName其中string, objectviewName, model,因此为了使用那个,你再次必须转向object。三个参数的重载是viewName, masterName, model

答案 1 :(得分:0)

默认情况下,WebFormViewEngine包含在RazorViewEngine之前。这就是为什么它正在寻找* .aspx。

要解决此问题,请通过在Global.asax.cs

中删除以下代码,让View Engine在WebForm Views之前查找Razor Views
protected void Application_Start() 
{ 
  ViewEngines.Engines.Clear(); 
  ViewEngines.Engines.Add(new RazorViewEngine()); 
  ViewEngines.Engines.Add(new WebFormViewEngine()); 
}