1、MVC3与传统的Web窗体等主要的差异之处
在构建传统的 ASP.NET Web Forms 应用程序或 Active Server Pages 应用程序时,URL是一一与页面相对应的,比如在服务器上请求名称为Index.aspx(http://localhost:1471/Index.aspx)的页面,那在服务器的相关位置必须存在Index.aspx这个页面,如果 SomePage.aspx 文件不存在,则将出现 404 – Page Not Found 错误。
相反,在构建 ASP.NET MVC 应用程序时,在浏览器中输入的URL与应用程序中的文件不存在对应关系,URL 对应的是控制器操作,而不是硬盘上的页面,比如在浏览器在输入http://localhost:1471/Home/Index,注意这里没有.aspx等其他的后缀名,该URL请求的是在HomeControllers控制器下的Index方法,但在相对应的Views文件夹下要建立相对应的子文件夹Home,其中包括Index.aspx等后缀名的页面,否则同样会出现错误,提示在Views中找不到相关页面。
2、了解URL路由
浏览器请求通过一项名为 URL 路由的 ASP.NET MVC 功能映射到控制器操作,URL 路由将进入的请求发送给控制器操作。URL路由使用路由表处理进入的请求。此路由表在应用程序第一次启动时创建。路由表在 Global.asax 文件中设置。默认的 MVC Global.asax 文件包含在程序清单中。
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
当ASP.NET应用程序第一次启动时,首先调用Application_Start()方法,该方法调用RegisterRoutes(RouteTable.Routes)方法创建默认的路由表。
现在需要先添加一个新的路由映射,然后在设置3个占位符参数,它们分别是p1, p2, p3.然后将p1约束为仅字母与数字的组合,p2约束为仅数字,p3没有添加约束。
routes.MapRoute(
"UsingParams",
"p/{p1}/{p2}/{p3}",
new
{
controller = "Home",
action = "UsingParams"
},
new { p1 = "[a-z0-9]+", p2 = @"\d+" }
);
routes.MapRoute(
"YouKu_Show",
"v_{action}/id_{id}.html",
new { controller = "YouKu" },
new { id = "[a-z0-9]{13}" },
new string[] { "MvcApplication1.YouKu" }
);
routes.MapRoute(
"YouKu_PlayList",
"v_{action}/{id}.html",
new { controller = "YouKu" },
new { id = "[a-z0-9]{12}" },
new string[] { "MvcApplication1.YouKu" }
);
再添加一个Home控制器的操作方法。
public ActionResult UsingParams(string p1, int p2, string p3)
{
string output = string.Empty;
output += "p1 = " + (p1 ?? "null");
output += "<br />p2 = "
+ (p2.HasValue p2.Value.ToString() : "没有值");
output += "<br />p3 = " + (p3 ?? "null");
return Content(output);
}
默认的路由表中包含一个路由。该默认路由将所有的进入的请求分拆为三个单元(url的'/'之间的所有内容),比如改URl:http://localhost:1471/Home/Index/3,第一单元映射到控制器名称:Controller=HomeController;第二单元映射到操作名称(在控制器中的方法名称):Action=Index;第三单元映射到传递给操作方法的ID参数:Id=3
默认路由包括所有三个单元的默认值。默认控制器是 HomeController,默认操作是 Index,而默认 ID 是一个空字符串。请观察这些默认值,考虑如何解析下面的 URL:
/Employee
此 URL 被解析为如下三个参数:
Controller = EmployeeController
Action = Index
Id = “”
最后,如果打开 ASP.NET MVC 应用程序而不提供任何 URL(例如 http://localhost/),那么 URL 将被解析为:
Controller = HomeController
Action = Index
Id = “”
请求将被发送到 HomeController 类上的 Index() 操作。
3、了解控制器
控制器负责控制用户与 MVC 应用程序的交互方式,控制器决定在用户发出浏览器请求时向用户发送什么样的响应。
控制器在ASP.NET MVC3当中是最终处理客户端请求的一个实现,他有个一硬性条件就是必须实现System.Web.Mvc.IController接口,而且类的命名必须要以Controller结尾,尽管按照硬性条件上来说,要自己实现一个接口比较纠结,但幸好的是在ASP.NET MVC3内部已经包含了一个默认的实现,我们只需要把类的命名设置为Controller结尾然后继承System.Web.Mvc.Controller类,立刻就可以轻松地实现了IController接口了.如果你不喜欢这种默认提供的实现方式,而是自己去实现IController的话.下面的代码可以做一个简单的参考:
public class HomeController : IController
{
public void IController.Execute(RequestContext request)
{
var httpContext = request.HttpContext;
var response = httpContext.Response;
response.ContentType = "text/html; charset=utf-8";
response.Write("自己的简单实现! Hello World");
}
}
请注意:控制器类不硬性要求放在*.Controllers命名空间中。
控制器只是一个类(例如,Visual Basic 或 C# 类)。示例 ASP.NET MVC 应用程序包括一个名称为 HomeController.cs 的控制器,该控制器位于 Controllers 文件夹内。HomeController.cs 的内容所示。
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
ViewData["Title"] = "About Page"; return View();
}
}
请注意,HomeController 有两个方法,名称为 Index() 和 About()。这两个方法对应于控制器公开的两个操作。URL /Home/Index 调用 HomeController.Index() 方法,而 URL /Home/About 调用 HomeController.About() 方法。
控制器中的任何公共方法都作为控制器操作被公开。请小心对待它们,这意味着通过向浏览器输入正确的 URL 来访问 Internet 的任何人都可以激活包含在控制器中的任何公共方法。
4、了解视图
由 HomeController 类公开的两个控制器方法 Index() 和 About() 都返回了一个视图。视图包括发送到浏览器的 HTML 标记和内容。在使用 ASP.NET MVC 应用程序时,视图就等于页面。
必须在正确的位置创建视图。HomeController.Index() 操作返回位于以下路径的视图:
\Views\Home\Index.aspx
HomeController.About() 操作返回位于以下路径的视图:
\Views\Home\About.aspx
总之,如果要为控制器操作返回视图(return View()),则需要在 Views 文件夹中使用与控制器相同的名称创建子文件夹。在子文件夹中,必须创建与控制器操作名称(后面的Controller不需要)相同的 .aspx 文件。
5、了解模型
MVC 模型包含所有视图或控制器不包含的应用程序逻辑。模型应该包含所有应用程序业务逻辑和数据库访问逻辑。例如,如果您正在使用 LINQ to SQL 访问数据库,那么您将在 Models 文件夹中创建 LINQ to SQL 类(dbml 文件)。
视图应该只包含与生成用户界面相关的逻辑。控制器应该只包含要求返回正确视图或将用户重定向到另一操作所需的最小逻辑。其他所有内容都应包含在模型中。
总之,应该努力实现高效模型和简化控制器。控制器方法应该只包含几行代码。如果控制器操作过长,则应该考虑将逻辑移动到 Models 文件夹中的一个新类中。
转载:http://www.cnblogs.com/snidget/archive/2011/08/19/2146044.html