MVC视图操作调用不同的控制器

时间:2015-07-28 20:50:55

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

我正在将一个简单的网站从WebForms转换为MVC5。在 Views 中有15个不同的文件夹,每个文件夹都有自己的Index.cshtml文件,这似乎很愚蠢。

我可以将所有视图放在一个名为 Home.cshtml Contact.cshtml Privacy.cshtml 的文件夹中,但是请将这些视图放在一起每个文件引用一个不同的控制器(即 HomeController.cs ContactController.cshtml PrivacyController.cs )?

UPDATE:目前,如果我尝试更改我的文件结构,以便所有视图都在一个名为Pages的文件夹中,它会尝试在 PagesController中找到相应的ActionResult

我希望拥有此文件结构,并能够使用 www.example.com/privacy 之类的网址加载我的网站,并获取 Pages / Privacy.cshtml < / em>查看并自动使用 PrivacyController.cs 或使用 www.example.com/contact 并获取 Pages / Contact.cshtml 查看并自动使用 ContactController.cs

4 个答案:

答案 0 :(得分:2)

为什么不使用一个控制器并进行多项操作。现在你将有一个视图文件夹。首先改变routeMap。

  routes.MapRoute(
                name: "Default",
                url: "{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

在HomeController内为每个网址创建操作

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

当您提出www.example.com/privacy请求时,它会调用隐私操作。这样您就可以得到您想要的内容。

答案 1 :(得分:1)

您可以将所有视图放在共享文件夹中,然后从控制器方法中选择要呈现的视图.View方法的一个重载将获取要呈现的视图的名称。

      public ActionResult Index()
      {
        //
         return View("myview");
       }

在Web表单中,每个视图都有一个代码隐藏文件,但mvc方法是不同的。您可以将每个操作视为其视图的代码隐藏。所以mvc中的控制器包含对象的相关操作..

答案 2 :(得分:0)

您可以设置不同的路由。一种方法是

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx");
}

所以请寻找MapPageRoute方法来定义自己的结构。

但是,我强烈建议您仔细研究MVC模式,因为特别是在较大的应用程序中,将事物分离以获得更好的结构和可测试性是完全合理的。如何构建控制器和视图有很多有用的指导,并且大多数已证明它们对许多开发人员有用。特别是来自WebForms,这是一种不同的方法 - 但非常值得冒险。

答案 3 :(得分:0)

已经提到过将文件放在/ Shared文件夹中并引用控制器中的视图名称的选项。另一种选择是create a custom RazorViewEngine and override the default search locations