0

我知道我的问题是什么,但不知道如何解决它,所以我希望这里的天才可以提供帮助。我有一个控制器,我想从 url 中获取一条信息,然后重定向到该站点。我的控制器做了这件事并返回视图,但视图中有一部分并且视图引擎找不到它?

所以这里是设置。

控制器映射路由为:

//marketing/tracking
routes.MapRoute("CampaignTracking",
                "{save}/{campaignid}",
        new { controller = "CampaignTracking", action = "Index" });

这很好用。所以接下来我的控制器:

public ActionResult Index(Int32 campaignID)
{
        var model = new ...snip...

        return View("../Customer/Login", model);
}

现在我最初收到错误找不到视图,因为它正在查看 CampaignTracking 文件夹,我有:

return View("Customer/Login", model);

所以我用 ../ 改变了它,如上所示,以到达正确的位置。现在它找到了 Login.cshtml,但在 login.cshtml 中它呈现了一个部分,并且它再次在 Campaigntracking 中寻找部分。

我可以取消 CampaignTracking 控制器并将操作结果移动到 CustomerController,但更愿意将其保留在自己的控制器中,因为这可能会增长并且不会真正分组在客户之下。

根据 nicu Janga

我在控制器中进行了更改:

return View(@"~/Views/Customer/Login.cshtml", model);

在我的 login.cshtml 中,部分内容:

@Html.Partial(@"~/Views/Customer/...etc.cshtml")

但我想知道为什么。我可以理解视图引擎是如何从控制器中出来的,但是一旦用 return View(@"~/Views/Customer/Login.cshtml", model); 正确的路径不应该也传播到 login.cshtml 吗?

显然不是,但我不明白什么?

4

2 回答 2

2

你可以试试这个:

   return View(@"~/Views/Customer/Login.cshtml",model);

有用?

于 2013-11-13T23:32:54.827 回答
2

让我看看是否可以为您填写一些详细信息。首先,假设我们刚刚将以下控制器添加到一个空项目中:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

现在,我们还假设我们没有费心添加Index.cshtml视图,所以当我们运行它时,它会告诉我们视图丢失了。查看伴随该异常的消息:

The view 'Index' or its master was not found or no view engine supports
the searched locations. The following locations were searched:
~/Views/home/Index.aspx
~/Views/home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/home/Index.cshtml
~/Views/home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml

这些是 MVC 尝试定位视图时搜索的确切位置。在大多数情况下,如果您将 C# 与 MVC 一起使用,您需要关心的只有两个:

~/Views/home/Index.cshtml
~/Views/Shared/Index.cshtml

这意味着如果您在指定视图名称时未提供路径,它将始终检查这两个位置。因此,如果我们从我们的HomeController

return View("Test");

MVC 将在~/Views/Home/Test.cshtml和 然后查找此视图~/Views/Shared/Test.cshtml。这样做的好处是它是一致的。它总是以同样的方式寻找视图。

现在,让我们使用一个更复杂的例子(同样,假设我们在我们的HomeController):

return View("../SomeDirectory/Test.cshtml");

这将通过以下方式进行查找:

~/Views/Home/../SomeDirectory/Index.cshtml
~/Views/Shared/../SomeDirectory/Index.cshtml

首先看一下~/Views/Home/../SomeDirectory/Index.cshtml,这实际上意味着它正在这里搜索视图:~/Views/SomeDirectory/Index.cshtml。显然,这不是你的观点所在,这同样适用于~/Views/Shared/../SomeDirectory/Index.cshtml最终的结果。

这里要记住的重要一点是~您网站的相对根目录。它始终从您网站的根目录运行,这意味着您始终可以确定到底发生了什么。通过做这个

return View("~/Views/Home/Index.cshtml");

您是在告诉 MVC在哪里可以找到您的视图,而不是让 MVC 的约定规则为您决定。这意味着每当您指定 MVC 查找视图的位置时,它只会搜索该位置。所以 return View("~/Views/Home/Index.cshtml")只会处搜索视图~/Views/Home/Index.cshtml。如果它在那里找不到视图,你会得到与以前相同的异常,但它会给你一个稍微不同的消息:

The view '~/Views/Home/Index.cshtml' or its master was not found or no view
engine supports the searched locations. The following locations were searched:
~/Views/Home/Index.cshtml

注意它没有在其他位置搜索视图。

于 2013-11-14T00:34:38.823 回答