我是一名刚开始使用 MVC3 框架的 Web 开发人员。我们正在构建一个网站,该网站为不同的受众群体实现了许多子文件夹。这种路由概念给我们的 SEO 结构带来了麻烦。
在路由部分下的 global.asax 文件中,我们有:
routes.MapRoute("test", "test/{testFirst}/{testSecond}",
new { controller = "test", action = "RouteTest", testSecond = UrlParameter.Optional });
在我的 Controller 中我们有:
public ActionResult RouteTest(string testFirst, string testSecond)
{
return View(testFirst, testSecond);
}
当我运行该网站并尝试转到/test/test/index 时,它不会拉出 View 。它一直在寻找不存在的 test.cshtml,因为它是一个文件夹而不是文件。
关于如何使嵌套文件夹工作有什么想法吗?
编辑: 这是我们想要的结构的一个分支,也许它会对我想要实现的目标有所帮助。
这有点难以展示,但应该可以传达这个想法。我们有 5 个不同的受众访问该网站。我分割了 1 位观众以及该观众的流量。
并非所有分割都会有产品,有些只是内容,其他分割则具有第三级并有可供查看的产品
观众
- 分割
- 分割
- 产品
- 分割
- 产品
- 分割
这是我们希望 URL 采用的基本结构
domain.com/audience/segment/products/(产品名称)
关于如何实现这一目标的建议
最佳答案
您对 View()
方法使用了错误的重载。以下是您调用 View(testFirst, testSecond)
时使用的内容:
protected internal ViewResult View(
string viewName,
string masterName
)
通过为 viewName
添加“test”,您可以告诉 Controller 渲染一个名为 Test
(test.cshtml) 的 View 。你没有。
在我看来,您正试图将 WebForms 与 MVC 关联起来。它不一样,您正在看到一个关于路由的主要示例。 ASP.NET MVC 不能脱离 NTFS 结构(文件夹和文件)工作。它依赖于通过路由定义进行路由。
如果您希望渲染 View “RouteTest”,请执行以下操作:
public ActionResult RouteTest(string testFirst, string testSecond)
{
ViewBag.testFirst = testFirst;
ViewBag.testSecond = testSecond;
return View();
}
这将呈现“RouteTest” View ,并且在动态对象 ViewBag
中,您将可以访问两个属性:testFirst
和 testSecond
。在您看来,您可以提取这些值。 (尽管我强烈推荐使用 ViewModel 的强类型 View )
示例解决方案
View 模型
public class TestData
{
public string testFirst { get ; set ; }
public string testSecond { get ; set ; }
}
Controller
public ActionResult RouteTest(string testFirst, string testSecond)
{
TestData td = new TestData();
td.testFirst = testFirst;
td.testSecond = testSecond;
return View(td);
}
强类型 View
@model TestData
@Html.Label(Model.testFirst)
@Html.Label(Model.testSecond)
关于c# - MVC3 Visual Studio 2010 中的嵌套文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200863/