mvc
MVC:要求安装:vs2008和MVC(http://www.asp.net/mvc)
新建项目:Web-ASP.NET MVC Web Application(使用ASP.NET MVC FrameWork 1.0,不是MVC2的版本)
初始目录:Models(空),Views(包括Account、Home、Shared),Controllers
文件包含:Views-Home下,包括About.aspx,Index.aspx,Controllers下,包括AccountController.cs,HomeController.cs
1。地址解释:http://localhost:3214/Home/Index
Home为Controller,Index为Action(函数),即调用HomeController.cs下的Index函数:
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View(); //无参数,显示对应的Index.aspx页。如果使用return View("about");则显示Views-Home下的About.aspx页。
}
Index.aspx:<%= Html.Encode(ViewData["Message"]) %>
2。页面的显示,是能过向服务器发送URL请求,由Controller接收,通过Controller来控制去显示哪一个Views(aspx)。
Models用来和数据库做交互,使用ORM,将数据库映射成类/对象,一般使用Linq来写访问语句。
3。ViewData的使用。在Controller下的Action中定义ViewData,在aspx中通过ViewData["keyword"]来读取。
对于简单的类型,可以直接显示,如字符串,可以直接用<%= ViewData["mystr"] %>。对于复杂一点的,如List<string>,在aspx页中要这样写:
<% foreach(string str in ViewData["myList"] as List<string> { %>
<%= str %>
<%}%>
也可以加上HTML标记,如UL,来显示。
4。TempData的使用。用法类似ViewData,但可以跨视图,且只能保存一次。
如在Index()中使用:
TempData["mytmp"] = "my temp data";
Response.Redirect("/home/about");
可以在about.aspx中接收到<%= TempData["mytmp"] %>,但当再次点击about的链接时(不是通过Index的Action来跳转),数据已经不存在了。
5。用ViewData传递对象实体。在Index()中:
NewsInfo info = new NewsInfo();
info.NewsId = 1;
info.NewsTitle = "newstitle";
ViewData["myNews"] = info;
在Index.aspx中读取对象的属性: <%= (ViewData["myNews"] as MyMVCAppName.NewsInfo).NewsTitle %>
6。新建页面:
A。新建一个Controller。右键Controllers文件夹,添加-Controller...。比如要加一个叫Edit的页,应该在这里新建一个Edit方法。
B。新建一个View。右键Views文件夹,添加一个叫News的文件夹,右键添加View...,名字叫做Edit。得到的访问的路径就是/News/Edit。
7。在Action中重定向:
可以用Response.Redirect("/Home/About");,或者return Redirect("/Home/About");,或者return RedirectToAction("About","Home"); //Action,Controller
8。URL解释规则:
在Global.asax.cs中,找到RegisterRoutes方法:
routes.MapRoute(
"Default", //Route名称
"{controller}/{action}/{id}", //URL格式规则
new { controller = "Home", action = "Index", id = "" } //默认值,如,当controller参数为空时,默认为Home
如果把{action}改成{action}.mystr,则原来的/News/Index这种URL就无法访问,而要用/News/Index.mystr去访问了。
9。MVC不推荐用原来的服务器件,页面显示一般使用helper类,主要有Html和Url。
如: <%= Html.ActionLink("aboutpage","about","home") %>或<%= Url.Action("myAction") %>
10。filter过滤器,可以在请求页的Action时做一些处理。
新建一个类,让它继承于System.Web.Mvc.ActionFilterAttribute。override以下方法:
OnActionExecuting,在Action之前发生,比如验证用户是否登录,跳转页。OnActionExecuted在Action之后发生,做数据善后工作。
OnResultExecuting,在Return之前发生(目前只学习到了Return View()这一种),OnResultExecuted,在Return之后发生。
例子:
A。在OnActionExecuting方法中添加: if (filterContext.HttpContext.Request.QueryString["k"] != "go") throw new Exception("this is a error");
B。在要应用的Controller中,添加这个filter,如在NewsController.cs中,在类定义的上一行或Index的Action的上一行添加[MyMVCAppName.Code.Filter]。
(项目名.文件夹.类名),将整个类或某个Action应用上这个Filter。
这时,如果访问/News/Index,会出现自定义的错误。正确的路径应该是/News/Index?k=go或/News/Index/k=go
11。QueryString传值:
在Action函数中可以这样写:ViewData['w"] = Request.QueryString["key"]; 然后在aspx中用<%= ViewData["w"] %>显示。
比如用这个方法写一个链接,把参数传过去:<%= Html.ActionLink("EditPage","edit","news", new { key="myParaValue"}, new { @class="cssClassName" }%>。
这个是访问NewsController下的Edit方法,并把名称为key的参数传过去,这个链接应用了cssClassName这个样式。
或者用更简单的方法,直接在Action函数中,把同名的key当作参数写进去。如:public ActionResult Edit(string key) { ViewData["w"] = key; ... }。
注意,这个参数名要和Request.QueryString的参数名一样。
12。表单Post传值,Edit.aspx中写一个Form:
<%using (Html.BeginForm("Index","News", FormMethod.Post)) {%>
NewsId:<%=Html.TextBox("tbNewsId", "1001", new { style="width:150px;" })%>
NewsTitle:<% =Html.TextBox("tbNewsTitle", "新闻标题", new { style = "width:150px;" })%>
<input type="submit" value="提 交" />
<% Html.EndForm(); }%>
NewsController.cs:
public ActionResult Index(string tbNewsId)
{
string NewsTitle = Request.Form["tbNewsTitle"];
ViewData["w"] = NewsTitle + "," + tbNewsId;
return View();
}
还有另一种更简单的方法,使用UpdateModel方法(实体的字段名称要和控件的ID值相同,比如要么都是NewsTitle,要么都是tbNewsTitle):
public ActionResult Index()
{
NewsInfo info = new NewsInfo();
UpdateModel(info, Request.Form.AllKeys);
ViewData["w"] = info.NewsTitle + "," + info.NewsId;
return View();
}