10

我已将一个 mvc 3 应用程序从 vs 2010 移植到 vs2012。

移植的应用程序使用 .NET 4。

所有旧位都可以工作,但是使用在 vs 2012 中创建的新视图,视图引擎不会为视图寻找 .cshtml 文件。

例如,当用户在 Solicitors 区域的 Welcome 控制器上请求 index 动作时,url 为:

mysite.com/solicitors/welcome/gg 

(其中 gg 是用户名)。在这种情况下,返回的错误是:

未找到视图“索引”或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置: ~/Areas/Solicitors/Views/Welcome/Index.aspx ~/Areas/Solicitors/Views/Welcome/Index.ascx ~/Areas/Solicitors/Views/Shared/Index.aspx ~/Areas/Solicitors /Views/Shared/Index.ascx ~/Views/Welcome/Index.aspx ~/Views/Welcome/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Index.ascx ~/Areas/Solicitors/ Views/Welcome/gg.master ~/Areas/Solicitors/Views/Shared/gg.master ~/Views/Welcome/gg.master ~/Views/Shared/gg.master ~/Areas/Solicitors/Views/Welcome/gg. cshtml ~/Areas/Solicitors/Views/Welcome/gg.vbhtml ~/Areas/Solicitors/Views/Shared/gg.cshtml ~/Areas/Solicitors/Views/Shared/gg.vbhtml ~/Views/Welcome/gg.cshtml ~ /Views/Welcome/gg.vbhtml ~/Views/Shared/gg.cshtml ~/Views/Shared/gg.vbhtml

我已经在 web.config 中的 appsettings 中添加了以下键,但没有任何区别。

<add key="webpages:Version" value="1.0" />

编辑:

SolictorAreaRegistration.cs 中的路由:

context.MapRoute(
                "Solicitors_Welcome",
                "Solicitors/Welcome/{nameUser}",
                new { controller = "Welcome", action = "Index", nameUser = UrlParameter.Optional }
            );

编辑2:

使用 RouteDebug,我可以看到找到了正确的控制器和操作。

路线数据

核心价值

姓名用户:gg

控制器:欢迎

行动:索引

数据令牌

核心价值

命名空间:System.String[]

领域:律师

UseNamespaceFallback: False

编辑 3:

正如我从调试中看到的那样,正确找到了路线:索引操作被命中。

当调用视图的行被调用时,就会出现问题:

namespace MyApp.Areas.Solicitors.Controllers
{
    [Authorize]
    public partial class WelcomeController : Controller
    {
        //
        // GET: /Solicitors/Welcome/
        public virtual ActionResult Index(string nameUser)
        {
            return View("Index", nameUser);
        } 
    }
}
4

2 回答 2

26

好的,深入了解它:

问题:

问题是我的视图模型是字符串类型。在我的操作中,我传入了一个字符串作为模型参数:

public virtual ActionResult Index(string nameUser)
        {
            return View("Index", nameUser);
        }

这将与 Controller.View(...) 的重载之一发生冲突:

View(string, string)

第二个参数需要布局文件的名称。当你这样做时,MVC 会去寻找一个布局文件,其名称与你的字符串的值相同,例如:

“你好,世界。我是个白痴,但如果你给我一个像样的错误信息,我也许可以修复这个错误。”

显然,不存在具有该名称的布局文件。也没有名为“gg”的布局文件(我的(测试)律师的用户名)。

解决方案:

解决方案很简单:

指定第二个参数是模型,而不是布局。

public virtual ActionResult Index(string nameUser)
        {
            return View("Index", model: nameUser);
        }

有用的文章:

要查看对此问题的详细讨论,请参阅以下文章:

MVC 陷阱:当使用视图的模型是字符串时要小心

非常感谢 heartysoft.com 的启发。

于 2012-09-10T17:51:50.413 回答
1

从错误消息中可以看出:

~/Areas/Solicitors/Views/Welcome/gg.cshtml 

如果您需要查找 Index 视图,则需要指定它:

http://mysite.com/solicitors/welcome/index/gg 
于 2012-09-10T12:54:10.917 回答