我正在将一个简单的网站从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
答案 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