尽管视图存在,但找不到它,因为它没有寻找正确的扩展名。

4

我对这个有些困惑。我正在使用MVC 3的razor,我在一个操作中有一个视图问题。

 [HttpGet]
 [ActionName("Unsubscribe")]
 public ActionResult UnsubscribeGet(string maskedId)
 {    
     return View("Unsubscribe", maskedId);
  }

Unsubscribe.cshtml视图位于正确的视图文件夹中。

路由为

routes.MapRoute(
               "", // Route name
               "Unsubscribe/{maskedId}", // URL with parameters
               new { controller = "Account", action = "Unsubscribe" });

当访问以下URL“/Unsubscribe/db94fddb”时,操作会触发,然后当它尝试查找视图时会显示以下错误。
找不到视图“Unsubscribe”或其主控件,或者没有视图引擎支持已搜索的位置。搜索了以下位置:
~/Views/Account/Unsubscribe.aspx
~/Views/Account/Unsubscribe.ascx
~/Views/Shared/Unsubscribe.aspx
~/Views/Shared/Unsubscribe.ascx
~/Views/Account/db94fddb.master
~/Views/Shared/db94fddb.master
~/Views/Account/db94fddb.cshtml
~/Views/Account/db94fddb.vbhtml
~/Views/Shared/db94fddb.cshtml
~/Views/Shared/db94fddb.vbhtml
请注意,在寻找退订(Unsubscribe)时,它没有寻找cshtml扩展名,但在寻找db94fddb时则有。
这只发生在此视图中,完全不知道如何解决。
**编辑**
找到了,
我使用System.String作为模型。由于某种原因,这导致它失败。
我将其替换为 @model UnsubscribeViewModel
[HttpGet]
[ActionName("Unsubscribe")]
public ActionResult UnsubscribeGet(string maskedId)
{
    return View("Unsubscribe", new UnsubscribeViewModel { MaskedId = maskedId } );
}

尽管现在已经可以工作了,但我仍然不知道之前为什么不行。我的视图设置为构建时编译,所以没有编译器错误。
我很想知道这里发生了什么。
1个回答

13

你使用的 View 方法的重载接受两个字符串作为参数。它不会将第二个字符串解释为模型,而是将其解释为母版页名称:

protected internal ViewResult View(
    string viewName,
    string masterName
)
如果你像这样调用它,它将会起作用:
return View("Unsubscribe", (object) maskedId);

甚至没有考虑过重载。感谢4中的命名参数。谢谢你的答案! - Brad Christie
1
感谢上帝给出了这个答案。这个问题让我抓狂了。 - immutabl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接