可能不是一个非常重要的问题,但是......
我有一堆主要是静态的页面:联系人,关于,使用条款,以及大约7-8个。
每个控件都应该有自己的控制器吗?或者我应该为每个控制器执行一个操作?
提前致谢。
答案 0 :(得分:7)
将静态页面添加到mvc应用程序的最佳方法是创建一个名为Pages
(或任何你想要的)的单独控制器,并将页面名称作为参数传递给它们的Index
方法。
因此,您需要在呈现之前测试页面是否存在,如果存在则呈现它,否则呈现您的自定义Page Not Found
页面。
这是一个例子:
在Global.asax中:
// put the StaticPage Rout Above the Default One
routes.MapRoute(
"StaticPages",
"Pages/{page}",
new { controller = "Pages", action = "Index"}
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
创建一个名为PagesController的控制器:
public class PagesController : Controller
{
public ActionResult Index(string page)
{
// if no paramere was passed call the default page
if (string.IsNullOrEmpty(page)) {
page = "MyDefaultView";
}
// Check if the view exist, if not render the NotfoundView
if (!ViewExists(page)) {
page = "PageNotFoundView";
}
return View(page);
}
// function that check if view exist
private bool ViewExists(string name)
{
ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);
return (result.View != null);
}
}
答案 1 :(得分:3)
ASP.NET MVC中的推荐用例是为每个模型创建一个单独的控制器,并根据关注在控制器上单独操作方法 ,例如,每个动作用于编辑,创建,检索和删除。
但是,在这个用例中,由于您提到您拥有的只是静态页面,因此可以通过使用一个控制器和与每个视图对应的单独操作方法来完成工作。它可以这样实现,
public HomeController : Controller
{
public ActionResult About()
{
return View();
}
public ActionResult TermsOfUse()
{
return View();
}
public ActionResult Contact()
{
return View();
}
// etc ........
}
此处选择 HomeController
,因为它默认出现在ASP.NET MVC项目中,并连接到Global.asax.cs
文件中的默认路由。
答案 2 :(得分:2)
单独考虑每个项目。如果您认为行动/视图可能需要的不仅仅是静态数据,那么现在就将其分解,否则您将不得不担心将来会破坏您的客户/访客/搜索链接引擎已保存/索引,现在您需要维护一些重定向等。
如果您确定它永远不会改变(哈哈说永远不会),那么使用一个具有许多动作/视图的控制器。例如:
http://yoursite.com/home/contact
http://yoursite.com/home/terms
http://yoursite.com/home/about
etc...
假设您将拥有许多其他代码,这将为您的项目提供非常基本的数据保存。如果大多数代码只是这些页面,你应该分解它,因为无论如何都没有任何混乱。
答案 3 :(得分:1)
让一个控制器对每个页面执行操作没有任何害处。我可能会创建一个带有ActionResult的HomeController和相应的联系人,关于,使用条款等的aspx视图...对于这个简单的情况,如果你想要更多地控制url或者有一个逻辑分组的控制器使感觉那么你可能想把它分成2个或更多的控制器。