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();
}

posted @ 2010-05-25 11:33  DaCHun  阅读(501)  评论(0编辑  收藏  举报