MVC 入门到精通 教程.doc_第1页
MVC 入门到精通 教程.doc_第2页
MVC 入门到精通 教程.doc_第3页
MVC 入门到精通 教程.doc_第4页
MVC 入门到精通 教程.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ASP.NET MVC 入门-1、简介 什么是MVC模式MVC(Model-View-Controller,模型视图控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。那么MVC模式和我们熟悉的WebForm模式有什么不同呢?他的各个部分又是怎样分工的呢?我们先来看一下普通的WebForm模式下,我们请求一个例如/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由index.aspx页面来呈现给用户。简单的示意图如下所示:也就是一个URL请求的是在服务器与该URL对应路径上的物理文件(ASPX文件或其他),然后由该文件来处理这个请求并返回结果给客户端。但是,对于MVC模式,这是怎样的一个过程呢?我们先来建一个ASP.NET MVC的项目吧。VS2008默认是没有ASP.NET MVC的项目模板的,首先我们需要到/downloads/details.aspx?FamilyId=A24D1E00-CD35-4F66-BAA0-2362BDDE0766&displaylang=en去下载最新的ASP.NET MVC的安装程序,目前最新版本的Microsoft ASP.NET MVC Beta(10/15/2008)。下载安装完后,我们可以在新建项目那里找到ASP.NET MVC的项目:注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下。建立一个ASP.NET MVC项目后,默认的项目大概如下图:我们可以看到项目中有几个文件夹的命名和MVC(Model-View-Controller,模型视图控制器模式)是对应的。然后我们运行一下项目看看:我们注意到地址栏的URL是 Home/Index,如果按照我们前面说的WebForm的模式的话,我们应该可以在我们的项目的根目录下找到Home目录,然后Home目录下有个Index的文件,但是我们并不能在根目录下找到Home这个目录。不过还是让我们在Views目录下找到了Views/Home/Index.aspx文件,我们输入这个地址运行看看:Oh,No!路径是对的,文件也存在,但为什么会是404,说找不到文件呢?如果不是直接访问存在的物理文件,那么MVC又是怎样工作的呢?原来啊,MVC模式的工作过程是这样的:在MVC中,客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。再说回前面我们运行的ASP.NET MVC程序访问的http:/localhost:2176/Home/Index这个URL,它访问的其实是HomeController中的Index这个Action,见下图:其中public ActionResult Index()这个方法称为Controller的Action,他返回的是ActionResult的类型。一个Controller可以有很多个Action。那么一个URL是怎样被定位到Controller中来的呢?我们先来看一下web.config文件,在web.config文件的httpModules配置节中,我们可以看到一个UrlRoutingModule:就是这个UrlRoutingModule来把URL定位到Controller中去的。而对于URL会被路由到哪一个Controller中去,这些我们是完全可以自己定义的。我们到Global.asax文件去看一下:我们可以看到这里定义了一个名为Default的Route,还定义了默认的参数。默认参数的意义在于,当我们访问例如http:/localhost:2176/的URL的时候,他会将不存在的参数用默认的参数补上,也就是相当于访问http:/localhost:2176/Home/Index一样。 注意:我们知道在IIS中,我们访问网站的根目录的时候,如果我们不指定要访问的路径,IIS会自己根据在IIS中设置的默认文档去访问。例如我们访问http:/localhost:2176/这个URL的时候,IIS会去寻找网站根目录下的Default.aspx文件(假设我们设置了IIS的默认文档为Default.aspx)。而在ASP.NET MVC中对于类似http:/localhost:2176/这样的网站根目录的路径,并不会经过Route的处理,所以我们看到我们建立的ASP.NET MVC程序的根目录下有个Default.aspx文件,该文件就是用于处理前面的访问根目录的情况的。请不要删除该文件。它会将http:/localhost:2176/Default.aspx交由ASP.NET MVC来处理,具体请看Default.aspx.cs文件。 我们知道了一个URL是怎样定位到相应的Controller中去的了,那么View又是怎么被返回给客户端的呢?我们从前面的截图中看到,Controller中的Action方法中有个return View()的方法。默认情况下它会返回与Action同名的view.在ASP.NET MVC默认的视图引擎(WebFormViewEngine)下,view是按如下路径访问的: /Views/Controller/Action.aspx 也就是说对于http:/localhost:2176/Home/Index这个路径,在默认情况下,在Index这个Action中用return View()来返回view的时候,会去寻找/Views/Home/Index.aspx文件,如果找不到这个文件,就会去Share目录中寻找:/Views/Share/Index.aspx,如果都找不到,就会抛出找不到View的异常。return View(lulu.aspx)来指定要返回哪一个view:/Views/Home/lulu.aspx。 那么为什么前面我们直接访问Views/Home/Index.aspx这里文件的时候会出现404错误,说找不到文件呢?因为在MVC中,是不建议直接去访问View的,所以我们建立的ASP.NET MVC程序在默认情况下就在Views目录下加了一个web.config文件,内容如下: 也就是访问Views目录下的所有的文件都会由System.Web.HttpNotFoundHandler来处理,所以请不要将资源文件(CSS、JS、图片等)放到Views目录中。如果你确实要放到Views目录下的话,请修改Views/web.config文件。 至此,大家应该对MVC的工作原理有一个大概的了解了。我们就先说到这里吧。Enjoy!ASP.NET MVC 入门-3、Routing 本系列文章基于Microsoft ASP.NET MVC Beta.在一个route中,通过在大括号中放一个占位符来定义( and )。当解析URL的时候,符号/和.被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大括号中的信息则作为常量值。下面是一些示例URL: Valid route definitionsExamples of matching URLcontroller/action/id/Products/show/beveragestable/Details.aspx/Products/Details.aspxblog/action/entry/blog/show/123reporttype/year/month/day/sales/2008/1/5通常,我们在Global.asax文件中的Application_Start事件中添加routes,这确保routes在程序启动的时候就可用,而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它,注册该routes的方法必需是静态的同时有一个RouteCollection参数。下面的示例是Global.asax中的代码,演示了添加一个包含两个URL参数action 和 categoryName的Route对象:publicstaticvoidRegisterRoutes(RouteCollectionroutes)/忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件routes.IgnoreRoute(resource.axd/*pathInfo);routes.MapRoute(Category,/Route的名称Category/action/categoryName,/带有参数的URLnewcontroller=Category,action=Index,categoryName=4mvc/设置默认的参数);protectedvoidApplication_Start()/在程序启动的时候注册我们前面定义的Route规则RegisterRoutes(RouteTable.Routes);更多文章请参考: System.Web.Routing入门及进阶下篇 By 重典 System.Web.Routing入门及进阶上篇 By 重典 ASP.NET MVC URL Routing 学习 By Q.Lee.lulu ASP.NET Routing (官方文档) 在这里我不打算再详细去讲解。以下只是简单的说明一下。忽略对某类URL的Routing:/忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件routes.IgnoreRoute(resource.axd/*pathInfo);添加约束条件,支持正则表达式。例如我们需要对id参数添加一个必须为数字的条件:routes.MapRoute(Default,controller/action/id,newcontroller=Home,action=Index,id=,newid=d*/id必须为数字); 使用星号(*)匹配不确定个数的参数,这会匹配URL后面所有的剩余的参数。例如: query/queryname/*queryvalues 对于url:query/aspnetmvc/preview5/routing ,则queryvalues参数匹配的参数为 preview5/routing。 url匹配Route是根据Route的定义顺序来自上而下匹配的。例如我们定义两个Route: publicstaticvoidRegisterRoutes(RouteCollectionroutes)routes.MapRoute(Default,/Route的名称controller/action/id,/带有参数的URLnewcontroller=Home,action=Index,id=/设置默认的参数);routes.MapRoute(Post,Post/id,newcontroller=Post,action=Index,id=);不知你看出上面定义的两个Route有什么问题没有?我想你看出来了,URL永远都匹配不了第二个Route,也就是名为Post的Route,因为能匹配第二个Route的url一样也能匹配第一个Route,而url匹配Route是根据Route的定义顺序来自上而下匹配的,所以URL永远都匹配不了第二个Route。所以,在定义Route的时候,要将一些特别的Route放到前面。 如果你要将ASP.NET MVC部署到IIS6下面,由于IIS6对于/index这类没有扩展名的URL是不会交由ASP.NET的aspnet_isapi.dll处理的,所以你的ASP.NET MVC程序部署到IIS6的时候可能会出现404错误。你可以为你的ASP.NET MVC站点添加一个通配符: 然后点击通配符应用程序映射下的插入按钮,在弹出的对话框中如下设置: 你如果担心添加通配符会给出现性能上的问题,那么你可以修改Route为带扩展名的,这个扩展名是完全由你自己定义的,例如我们使用4mvc来做url的扩展名: routes.MapRoute(Default,/Route的名称controller.4mvc/action/id,/带有参数的URLnewcontroller=Home,action=Index,id=/设置默认的参数); 然后再在IIS6中添加这个扩展名的映射: 然后我们访问的URL类似于:/Home.4mvc/index 群上有些朋友说希望教程能根据一个示例程序来写,那样更容易他们的学习。所以这里就写一个Blog的示例程序,为了方便,Model就直接使用Blogengine的业务实体部分。在这里我们先定义这个blog的Route: BlogRoutepublicstaticvoidRegisterRoutes(RouteCollectionroutes)/忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件routes.IgnoreRoute(resource.axd/*pathInfo);routes.MapRoute(Admin,Admin/action,newcontroller=Admin,action=Index);routes.MapRoute(PostById,Post/id,newcontroller=Home,action=Post,id=,newid=d+);routes.MapRoute(PostBySlug,Post/slug,newcontroller=Home,action=Post);routes.MapRoute(Default,/Route的名称controller/action/id,/带有参数的URLnewcontroller=Home,action=Index,id=/设置默认的参数); 暂时就学到这里吧。后面我会给出本示例Blog程序的代码。Enjoy!SP.NET MVC 入门-4、Controller与Action 本系列文章基于ASP.NET MVC Preview5.Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据。在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类。Controller类继承自ControllerBase类,而ControllerBase实现是了IController接口。ControllerBase实现了IController接口的Execute方法,在Route匹配到Controller之后,就会调用Execute方法来进入Controller的处理。这里还定义了一个抽象的方法ExecuteCore方法,该方法会在Execute方法的最后被调用。ControllerBase还定义了三个核心的属性。我们在后面会详细讨论TempData和ViewData。Controller类除了继承自ControllerBase类以外,还实现了好几个Filter接口,Filter我们在后面再详细讨论。publicabstractclass Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter Controller类还定义很多有用的方法,我们新建的Controller都必须继承自这个Controller类。例如我们新建一个AdminController: publicclass AdminController : Controller Action方法下面谈一下在Controller中比较重要的Action方法。在ASP.NET MVC中URL都是映射到Controller中的某个Action中,然后由匹配的Action来处理我们的业务逻辑并返回view的。Controller中的public的方法都被当作是Action方法。Action方法通常返回一个ActionResult的结果。例如我们为前面的AdminController定义一个Setting的Action方法,用于设置Blog的一些基本参数:publicclass AdminController : Controller public ActionResult Setting() thrownew NotImplementedException(); 默认情况下,Action方法的方法名就是这个Action的Action名(Action名指的是Route中匹配Action方法的URL的那部分。例如url:Home/Index,其中Index就是Action名)。这里为什么要提到这个Action名呢?应为Action名是可以定义的,使用ActionNameAttribute来定义。请看下面的示例:public ActionResult Setting() thrownew NotImplementedException(); ActionName(Setting)public ActionResult SaveSetting() thrownew NotImplementedException(); 这两个Action方法的Action名都为Setting,即对于url:Admin/Setting ,能同时匹配到这两个Action方法。如果一个URL同时匹配到两个Action方法的话,程序会抛出一个错误:如果我们希望这两个Action的Action名都为Setting,Setting()就用于显示一个表单页面给用户,而SaveSetting()就用于保存用户提交过来的表单数据,我们该怎么做呢?我们可以利用AcceptVerbsAttribute来设置,这个Attribute用来定义Action方法会匹配指定的HttpMethod。例如下面的代码:AcceptVerbs(GET)public ActionResult Setting() thrownew NotImplementedException(); ActionName(Setting), AcceptVerbs(POST)public ActionResult SaveSetting() thrownew NotImplementedException(); 这样,对于HttpMethod为GET的客户端请求,就会匹配到Setting()来显示一个表单给用户,如果用户POST回来的表单数据,则会匹配到SaveSetting()上面去,我们就可以处理用户POST过来的数据并保存到数据库。在这里AcceptVerbsAttribute是继承自ActionSelectionAttribute的,我们也可以继承自ActionSelectionAttribute来自定义自己想要实现的功能。这个我们后面会详细讲解。如果你比较心急,可以看下A Mvc Preview 5 体验-实现ActionSelectionAttribute来判断是否为AJAX请求而选择不同的Action这篇文章。如果你想将一个public的方法设置为不是Action方法,那么你就要为该public的方法添加NonAction的Attribute:Action方法的参数例如我们要在AdminController中定义一个编辑日志的Action方法:public ActionResult EditPost(int? id) thrownew NotImplementedException(); 对于URL:Admin/EditPost/2 ,上面的参数会自动被赋值为2。ASP.NET MVC在匹配Route的时候会根据Route的设置自动为Action方法的参数赋值。所以前面的id参数会被自动赋值为2的前提是,在Route配置的时候,必须指定了id参数,例如:routes.MapRoute( Default, / Route 的名称 controller/action/id, / 带有参数的URL new controller =Home, action =Index, id = / 设置默认的参数); 如果我们将Route修改为: routes.MapRoute( Default, / Route 的名称 controller/action/para, / 带有参数的URL new controller =Home, action =Index, para= / 设置默认的参数); 则前面的Action方法的参数必须修改为public ActionResult EditPost(int? para) ,使Action方法的参数和Route中定义的参数名相同,ASP.NET MVC才能自动为Action方法的参数赋值。 ActionResult Action方法返回ActionResult类型的结果。ASP.NET MVC为我们提供了几种ActionResult的实现,如下:窗体顶端ViewResult. 呈现视图页给客户端。由View 方法返回.RedirectToRouteResult. 重定向到另外一个Route。由RedirectToAction 和RedirectToRoute 方法返回.RedirectResult. 重定向到另外一个URL。由 Redirect 方法返回.ContentResult. 返回普通的内容。例如一段字符串。由 Content 方法返回.JsonResult. 返回JSON结果。由 Json 方法返回.EmptyResult. 如果Action必须返回空值,可以返回这个结果。Controller中没有实现的方法,可以return new EmptyResult();.当然我们也可以自定一个我们的ActionResult返回给客户端,例如一个RssResult。可以参考Asp.Net MVC实践 - 自定义ActionResult实现Rss输出 (基于ASP.NET MVC Preview 3)这篇文章。通常情况下,我们的Controller可能有一些相同的情况,例如我们在各个Controller中都有可能会在出错或者什么时候想要显示一条提示信息给用户,或者有一些共同的数据要呈现的。这时候,我们最好就定义一个我们自己的Controller的基类: publicclass BaseController : Controller public BaseController() protected ActionResult ShowMsg(List msgs) thrownew NotImplementedException(); public ActionResult Message() thrownew NotImplementedException(); 然后,其他的Controller都继承自这个BaseController :publicclass AdminController : BaseController AcceptVerbs(GET) public ActionResult Setting() thrownew NotImplementedException(); ActionName(Setting), AcceptVerbs(POST) public ActionResult SaveSetting() thrownew NotImplementedException(); public ActionResult EditPost(int? id) thrownew NotImplementedException(); 好,时间不早了,就先到这里吧。Enjoy!ASP.NET MVC 入门-5、View与ViewData 本系列文章基于ASP.NET MVC Preview5.view在MVC模式中与用户进行最直接的接触,它负责数据的呈现。这里要注意一点就是,view只是负责数据的呈现,所以我们应该要尽量让view中不涉及业务逻辑的处理。我们来添加一个Blog首页的view。在安装了ASP.NET MVC后,我们在添加新项目的时候可以看到有MVC的view模板:注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下。其中MVC View Content Page是有母版页的。我们在Views/Home目录下添加一个MVC View Content Page,并选择我们Views/Shared目录下的Site.Master母版页:publicpartialclass Index : ViewPageASP.NET MVC默认是使用WebForm来作为view的。所以我们看到新建的aspx页面继承自ViewPage,如果使用aspx页面作为ASP.NET MVC的视图引擎,则所有的aspx页面都必须继承自ViewPage。我们再看一下ViewPage: 我们看到ViewPage继承自ASP.NET WebForm的Page页,还实现了IViewDataContainer接口,同时还提供了一些Helper类的实例。我们可以使用ViewData来从Controller中往view页面中传递数据。下面我们在HomeController中的Index Action中取出Posts列表,然后在View中显示。我们先在Controller中取出数据,前面说过,为了方便,我们会直接使用BlogEngine的Model层来作为我们这个4mvcBlog的Model。所以我们的代码如下:public ActionResult Index(int? id) ViewDataTitle = BlogSettings.Instance.Name; List posts = BlogEngine.Core.Post.Posts .ConvertAll(new Converter(delegate(Post p) return p as IPublishable; ); int pageIndex = (id !=null& id.HasValue & id.Value 0) ? id.Value : 1; int pageSize = Math.Min(posts.Count, BlogSettings.Instance.PostsPerPage); if (pageIndex -1) * pageSize + pageSize posts.Count) return ShowMsg(new List() 页码超出范围 ); posts = posts.GetRange(pageIndex -1) * pageSize, pageSize); ViewDataPosts = posts; /向ViewData中传数据 /这里返回View给客户端,如果不指定要返回的View的名称, /就是返回和Action同名的View, /也就是相当于return View(Index); return View();默认的WebFormView搜索View的顺序是按如下顺序搜索的: 其中1为ControllerName,0为ActionName。MasterLocationFormats为母版页的搜索顺序。 在上面的代码中我们使用ViewDataPosts向View页面传递数据,然后我们就可以在View中取出数据并呈现给用户,Views/Home/Index.aspx页面的部分代码如下:如上红色框中的代码,我们可以从ViewData中取出数据,并转换为相应的类型。在这里我们发现ViewData要做一个类型的转换,其实我们可以将ViewData.Model设置为强类型,只需将我们的View页面继承自ViewPage就可以了:然后在Controller里面return View()的时候直接给ViewData.Model传值,如下所示:然后在View中我们可以直接从强类型的ViewData.Model中取值:由上面的代码我看可以看出ViewData.Model就是List类型,并不需要再进行类型的转换。ViewData还有一个Eval的方法,我们可以使用这个方法从ViewData中取值。假如我么在Action中使用return View(Post);给View传递一篇日志的数据。而Post有一个Previous的属性指向前一篇日志,则我们可以在View页面中可以这样来取值:但是如果使用我最后提供的示例Blog程序的代码这样在取值的时候直接在里面使用.来取值,你会发现取不了值。因为BlogEngine里面的BusinessBase类实现了IDataErrorInfo接口,而IDataErrorInfo有一个索引器,也就是说BusinessBase有一个索引器,就因为有一个索引器,使Eval中不能用点来取值(不知道是不是bug?)。补充:上面说到的不是Bug,是因为BusinessBase实现了IDataErrorInfo接口,该接口有个索引器,导致ViewData.Eval()方法调用时搜索索引器的值时返回String.Empty而使ViewData.Eval()认为是找到值了,从而失效。我们可以将return string.Empty修改为return null,这样就可以了。好,这一部分就先到这里吧。Enjoy! 本文示例Blog的代码:4mvcBlog_5.rar ASP.NET MVC 入门-6、TempData 本系列文章基于ASP.NET MVC Preview5.ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据,相信大家都看过“在ASP.NET页面间传值的方法有哪几种”这个面试题,在ASP.NET MVC中TempData的就是其中的一种传值方法。TempData默认是使用Session来存储临时数据的,TempData中存放的数据只一次访问中有效,一次访问完后就会删除了的。这个一次访问指的是一个请求到下一个请求,因为在下一个请求到来之后,会从Session中取出保存在里面的TempData数据并赋值给TempData,然后将数据从Session中删除。我们看一下ASP.NET MVC Preview5源码:也就是说TempData只保存到下一个请求中,下一个请求完了之后,TempData就会被删除了。注意这里TempData使用Session来做存储的,Session是对应特定用户的,所以并不存在并发问题。如果你用数据库来做TempData的存储介质的话,必须要考虑这个情况的。至于如何自定义TempData的存储介质,你可以参考“ASP.NET MVC: 用db4o来做TempDataProvider(另附一个泛型的RedirectToAction方法)”这一篇文章。前面说到的在我们的BaseController中有一个显示提示信息给用户的方法,这个提示信息就是临时的信息,我们可以使用TempData来实现。下面让我们来实现这个提示信息的方法:protectedActionResultShowMsg(Listmsgs)TempDataMessages=msgs;returnRedirectToAction(Message);publicActionResultMessage()returnView(TempDataMessagesasList); 因为我们的Controller都继承自这个我们自定义的BaseController,所以我么可以才Controller中这样来给用户显示提示信息:好,这一部分就先到这里吧。Enjoy! 本文示例Blog的代码:4mvcBlog_5.rar ASP.NET MVC 入门-7、Hellper与数据的提交与绑定 本系列文章基于ASP.NET MVC Preview5.ASP.NET MVC提供了很多Hellper的方法,Hellper就是一些生成HTML代码的方法,方便我们书写HTML代码(有一部分的朋友更喜欢直接写HTML代码)。我们也可以利用.NET 3.5的扩展方法来书写我们自己的Hellper。例如:生成的HTML代码就是:首页。这里有一点需要注意的就是,Html.ActionLink()和Url.Link()方法生成的URL和你在Global.asax里面配置的Route的先后顺序是有关的。具体的关于Hellper的各个方法的使用我就不详细介绍了,你可以参考重典的A Mvc Framework 系列文章。我们来实现前面提到的Setting,用于设置Blog的基本设置。我们看一下在Views/Admin/Setting.aspx页面的代码:Blog的名称Blog的简单描述每页显示的日志数 我们的Setting Action方法是这样写的:注意我们是return View(BlogSettings.Instance);给ViewData.Model传递了BlogSettings.Instance。然后运行一下看看:注意到上面的TextBox都有值了么?我们使用了Html.TextBox(Name)而已,并没有指定值啊?那么这个值是怎么自动的绑定上去的呢?注意到前面在Action中我们是return View(BlogSettings.Instance);给ViewData.Model传递了BlogSettings.Instance,BlogSettings.Instance.Name和Html.TextBox(Name)的参数Name同名,Html.TextBox()方法在调用的时候会调用ViewData.Eval()方法,所以就自动把值绑定上去了。和前一篇文章说过的ViewData.Eval()可以使用.表达式一样,Html.TextBox()也同样可以使用.表达式,例如:Html.TextBox(Post.Title)也可以自动绑定ViewData.Model.Post.Title值上去。下面我们来将值提交到Action中并保存。我们的Form使用了Post回服务器:formid=fieldsaction=method=post然后我们在Action中进行处理:ActionName(Setting),AcceptVerbs(POST)publicActionResultSaveSetting()/当然你可以这样取值/s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论