17.4 ASP.NET MVC开发

  在了解了ASP.NET MVC工作原理和工作流程,以及ASP.NET MVC中的URL映射基础原理,就能够进行ASP.NET MVC应用程序的开发,在进行ASP.NET MVC应用程序开发的过程中可以深入的了解ASP.NET MVC应用程序模型和URL映射原理。

17.4.1 创建ASP.NET MVC页面
  ASP.NET MVC应用程序包括MVC三个部分,其中Models是用于进行数据库抽象,Views是用于进行视图的呈现而Controllers是用于控制器和逻辑处理,在创建ASP.NET MVC应用程序时,可以为ASP.NET MVC应用程序分别创建相应的文件。首先在Views文件夹中创建一个文件夹,这里创建一个Beta文件夹。创建文件夹后单击Beta文件夹,右击文件夹,在下拉菜单中选择【添加】选项,在【添加】选项中单击【新建项】选项,单击后系统会弹出对话框用于View文件的创建,如图17-16所示。
创建View文件
图17-16 创建View文件
  在Views中可以创建MVC View Page用于Views文件的创建,从而用于在ASP.NET MVC应用程序中呈现相应页的视图,在Index.aspx中可以编写相应的代码用于视图的呈现,Index.aspx页面代码如下所示。
+展开
-HTML
<%@ Page 
Language="C#" 
AutoEventWireup="true" CodeBehind="Beta.aspx.cs" Inherits="_17_1.Views.Beta.Beta" %>

    <h2>About Us</h2>
        <p>
        <span style="color:red">这是一个测试页面</span>
        </p>

  Index.aspx页面用于视图的呈现,在一个传统的ASP.NET应用程序窗体中,ASP.NET应用程序窗体是派生自System.Web.UI.Page的,而ASP.NET MVC应用程序页面代码需要派生自ViewPage,Index.aspx的cs文件代码在创建时与传统的ASP.NET应用程序窗体不同,示例页面代码如下所示。
+展开
-C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; //使用MVC命名空间
namespace _17_1.Views.Beta
{
    public partial class Index : ViewPage//派生自ViewPage
    {
    }
}

  在完成Beta.aspx的创建后,在ASP.NET MVC应用程序开发模型中还需要创建Controllers用于接受用户请求和Beta.aspx页面同名的方法实现。单击Controllers文件夹,右击Controllers文件夹,在下拉菜单中选择【添加】选项,在【添加】选项中单击【新建项】选项。这里可以创建一个同名的类文件,如图17-17所示。
创建Controllers文件
图17-17 创建Controllers文件
  创建Controllers类文件时,创面的类文件的名称必须为Views文件夹中相应的视图文件夹的名称加上Controllers.cs,正如图17-17所示,如创建的是“Beta”文件夹,在创建Controllers时必须创建BetaControllers.cs,在创建相应的类文件后才能够拦截相应的URL并进行地址映射,创建后的Controllers类文件代码如下所示。
+展开
-C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;//使用MVC命名空间
using System.Web.Mvc.Ajax;//使用MVC命名空间
namespace _17_1.Controllers
{
    [HandleError]
    public class BetaController : Controller
    {
        public ActionResult Index()//实现Index方法
        {
            return View();//返回Index视图
        }
    }
}

  这里值得注意的是,仅仅创建一个Index.aspx页面并不能够在浏览器中浏览Index.aspx页面,必须在相应的Controllers类文件中实现与Index.aspx页面文件同名的方法Index()才能够实现Index.aspx页面的访问。Views中的Index.aspx页面能够使用Controllers类文件中的Index方法中的变量进行数据呈现。单击【F5】运行页面,运行后如图17-18所示。
MVC页面运行
图17-18 MVC页面运行
  这里讲解了如何手动创建ASP.NET MVC页面。在某些版本的Visual Studio中,安装了ASP.NET MVC开发包应用程序后,可能不会存在MVC文件的创建,这时只能通过创建ASP.NET Web Form再通过编码实现。
  如果希望能够创建ASP.NET MVC模板而不使用手动创建可以在C:\Program Files\Microsoft ASP.NET\ASP.NET MVC Beta\Temp目录下将压缩包拷贝到相应的Visual Studio安装目录X:\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\CSharp\Web\2052\中,拷贝后在开始菜单中选择“运行”,在窗口中输入cmd,就会弹出一个黑色的命令行窗口,在命令行输入cd X:\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\CSharp\Web\2052\进入目录,输入devenv.exe /setup进行模板的安装,安装完成后就能够在添加新项中选择MVC应用程序模板。

17.4.2 ASP.NET MVC 数据呈现(ViewData)
  在ASP.NET MVC应用程序中,Controllers负责数据的读取而Views负责界面的呈现,在界面的呈现中Views通常不进行数据的读取和逻辑运算,数据的读取和逻辑运算都交付给Controllers负责。为了能够方便的将Controllers与Views进行整合并在Views中呈现Controllers中的变量,可以使用ViewData整合Controllers与Views从而进行数据读取和显示。
  在ASP.NET MVC应用程序的Views中,其值并不是固定的,而是通过Controllers传递过来的,在Controllers类文件中的页面实现代码中,可以需要使用ViewData进行值的传递,BetaControllers.cs中Index.aspx实现的Index()的方法示例代码如下所示。
+展开
-C#
    [HandleError]
    public class BetaController : Controller
    {
        public ActionResult Index()//实现Index方法
        {
            ViewData["beta"] = "这是一个ViewData字符串";//使用ViewData
            return View();//返回视图
        }
    }

  上述代码使用ViewData存储数据,ViewData的声明和赋值方式与Session对象相同,直接通过编写ViewData[键值的名称]=XXX进行相应的键值的赋值。如果需要在页面中进行相应的值的呈现,只需要输出ViewData[键值的名称]即可。
  在ASP.NET MVC应用程序中,字符输出都需要呈现在Views视图中,在Controllers中进行ViewData变量的赋值,就需要在Views中输出相应的变量,BetaControllers.cs中的Index()方法实现的是Index.aspx页面,在Index.aspx可以使用ViewData["beta"]变量,示例代码如下所示。
+展开
-HTML
    <h2>About Us</h2>
    <p>
        <span style="color:Red">这是一个测试页面</span><br>
        <span style="color:Green"><%=ViewData["beta"%></span>
    </p>

上述代码中在运行后会输出ViewData["beta"]变量中存储的值,运行后如图17-19所示。
输出ViewData
图17-19 输出ViewData
  ViewData不仅可以为某个具体的值,ViewData还可以是一个泛型变量,示例代码如下所示。
+展开
-C#
    [HandleError]
    public class BetaController : Controller
    {
        public ActionResult Index()
        {
            List<string> str = new List<string>();//创建泛型变量
            str.Add("str字符串1<hr/>");//添加成员
            str.Add("str字符串2<hr/>");//添加成员
            str.Add("str字符串3<hr/>");//添加成员
            str.Add("str字符串4<hr/>");//添加成员
            ViewData["beta"] = str;//赋值ViewData
            return View();//返回视图
        }
    }

  在为ViewData赋值泛型变量后,在相应的View页面中也可以输出ViewData的值,示例代码如下所示。
+展开
-HTML
    <h2>About Us</h2>
    <p>
        <span style="color:Red">这是一个测试页面</span><br>
        <% foreach(string str in ViewData["beta"] as List<string>) %>
        <%=str%>
    </p>

  上述代码通过使用foreach进行ViewData变量中相应健值的值的遍历,运行后如图17-20所示。
遍历ViewData变量的值
图17-20 遍历ViewData变量的值
  使用List类能够将数据库中的数据存放在泛型列表类中,开发人员能够将数据库中的数据遍历并存放在Controllers类文件中的页面实现的类的ViewData变量中,当需要遍历数据进行呈现时,例如新闻列表或者是论坛列表等,可以通过遍历ViewData变量的值遍历输出数据库中的数据。

17.4.3 ASP.NET MVC 跨页数据呈现(TempData)
  ASP.NET MVC TempData同ASP.NET MVC ViewData一样,是在Controllers中声明的变量以便在Views中进行调用,示例代码如下所示。
+展开
-C#
    [HandleError]
    public class BetaController : Controller
    {
        public ActionResult Index()
        {
            TempData["beta"] = "TempData字符串";
            return View();
        }
    }

  上述代码在Controllers中声明了TempData,在Views中的相应页面可以使用此TempData进行变量的输出,示例代码如下所示。
+展开
-HTML
<%@ Page 
Language="C#" 
AutoEventWireup="true" CodeBehind="Beta.aspx.cs" Inherits="_17_1.Views.Beta.Index" %>

    <h2>About Us</h2>
    <p>
        <%=TempData["beta"%>
    </p>

上述代码呈现了TempData变量的值,运行后如图17-21所示。
显示TempData变量
图17-21 显示TempData变量
  在数据呈现上,TempData变量同ASP.NET MVC ViewData基本相同,但是TempData能够在跳转中保存值。当用户访问一个页面时,该页面的Controllers中包含TempData变量。当这个页面通过Redirect跳转到另一个页面时,另一个页面能够使用跳转页面的TempData变量。在跳转页面中,在跳转前可以编写TempData变量保存相应的值,示例代码如下所示。
+展开
-C#
    [HandleError]
    public class BetaController : Controller
    {
        public ActionResult Index()
        {
            TempData["Index"] = "这是跳转页面的字符串哦..";//编写TempData
            Response.Redirect("/Beta/Get");//页面跳转
            return View();//返回视图
        }
    }

  上述忽代码编写了一个TempData变量并将页面跳转到Get.aspx,这里在Beta文件夹下创建一个Get.aspx页面读取相应的TempData变量的值。创建完成后,编写HTML代码如下所示。
+展开
-HTML
<%@ Page 
Language="C#" 
AutoEventWireup="true" CodeBehind="Get.aspx.cs" Inherits="_17_1.Views.Beta.Get" %>

    <h2>接受传递的参数</h2>
        <p>
            <%=TempData["Index"%>
        </p>

  编写了页面代码后还不能对页面进行访问,由于MVC编程模型中路径是访问的Controller中的方法,所以还需要在Controller中实现Get页面的方法,示例代码如下所示。
+展开
-C#
        public ActionResult Get()
        {
            return View();//返回默认视图
        }

  上述代码返回默认视图,当不给View方法进行参数传递,将会返回与方法同名的.aspx页面文件。这里没有对View方法传递参数,则返回的是Get.aspx页面视图,当用户访问/Beta/路径时,代码会创建一个TempData变量并跳转到/Beta/Get路径,在/Beta/Get路径相应的文件中可以获取跳转前的TempData变量的值,运行后如图17-22所示。
接受TempData变量的值
图17-22 接受TempData变量的值
  在Get.aspx页面相应的实现代码中并没有声明任何的TempData变量,而是在跳转前的页面中声明的TempData变量,与ViewData相比跳转后的页面能够获取TempData变量的值而不能获取ViewData的值,这在某些应用场合如抛出异常等情况下非常适用。
  注意:TempData变量在跳转中能够跨页面进行数据读取,但是跨页面跳转后TempData变量只能呈现一次。简单的说就是跳转的第一次能过获取跳转前页面的TempData变量的值,而再次操作时就无法使用跳转前页面的TempData变量值。

17.4.4 ASP.NET MVC页面重定向
  在ASP.NET Web Form中,可以通过Response.Redirect(页面)的方法进行页面的重定向,在ASP.NET MVC编程模型中,也可以通过Response.Redirect(页面)的方法进行页面重定向。不仅如此,ASP.NET MVC编程模型还支持多种页面重定向方法,传统的页面重定向可以使用Response.Redirect(页面)方法,示例代码如下所示。
+展开
-C#
        public ActionResult Index()
        {
            Response.Redirect("/Beta/Get");// Response.Redirect(页面)
            return View();//返回视图
        }

  在MVC应用程序框架中,开发人员不仅能够使用传统的Response.Redirect(页面)的方法进行页面重定向,MVC还支持直接返回重定向参数进行重定向,示例代码如下所示。
+展开
-C#
        public ActionResult Index()
        {
            return Redirect("/Beta/Get");//返回重定向参数
        }

  上述代码通过使用重定向参数进行页面重定向。由于MVC编程模型是通过Controllers进行页面的呈现,而MVC编程模型同样是基于面向对象的,当用户访问某个路径实际上是访问相应的Controllers的方法。对于相同的页面而言,开发人员能够使用MVC编程模型中提供的RedirectToAction进行页面重定向,示例代码如下所示。
+展开
-C#
        public ActionResult Index()
        {
            return RedirectToAction("Get");//通过方法重定向页面
        }
        public ActionResult Get()
        {
            return View();//返回默认视图
        }

  上述代码只能使用在同一个Controllers中,当需要跳转到不同的Controllers中时,同样可以通过此方法进行页面重定向,示例代码如下所示。
+展开
-C#
        public ActionResult Index()
        {
            return RedirectToAction("Login","Account");//跨Controllers跳转
        }

  上述代码同样使用RedirectToAction 方法进行重定向,重载的RedirectToAction方法前一个参数是相应的页面的方法,而后一个参数是相应的页面所在的Controllers。

17.4.5 ASP.NET MVC URL路由(URLRouting)
  在ASP.NET MVC编程模型中,除了M、V、C三个模块,MVC编程模型中最为重要的就是ASP.NET MVC URLRouting的概念。运行ASP.NET MVC应用程序,其URL如图17-23所示。
ASP.NET MVC应用程序URL路径
图17-23 ASP.NET MVC应用程序URL路径
  从途中可以看出URL路径为http://localhost:2448/Home/About,从前面的小结中可以知道,当访问了该路径时,实际上是访问了HomeControllers.cs中的About方法,而About方法通过About.aspx页面进行视图呈现,视图中所使用的数据是在About方法中声明的ViewData,这样才组成了一个MVC应用程序页面。
  ASP.NET MVC应用程序中实现上述过程,即将/Home/About映射到相应的Controllers的相应方法中就必须使用到ASP.NET MVC URLRouting,ASP.NET MVC URLRouting定义在Global.ascx文件中,Global.ascx文件代码如下所示。
+展开
-C#
namespace _17_1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)//注册路由
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//注册路径
            routes.MapRoute(
                "Default",//设置默认名称
                "{controller}/{action}/{id}",//设置路由规则
                new { controller = "Home", action = "Index", id = "" }//实现默认规则
            );
        }
        protected void Application_Start()//应用程序执行
        {
            RegisterRoutes(RouteTable.Routes);//实现方法
        }
    }
}

  上述代码通过URLRouting实现了URL地址的映射,在Global.ascx中,最为重要的是RegisterRoutes方法,该方法实现了相应映射规则,示例代码如下所示。
+展开
-C#
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//注册路径
            routes.MapRoute(
                "Default",//设置默认名称
                "{controller}/{action}/{id}",//设置路由规则
                new { controller = "Home", action = "Index", id = "" }//实现路由规则
            );
        }

  上述代码中使用了RouteCollection对象的MapRoute进行地址配置,其中为ASP.NET MVC应用程序URL的配置的规则为"{controller}/{action}/{id}",这也就是说其映射会按照controller名称、方法名称和ID进行映射,所以/Home/About路径就映射到了HomeControllers.cs中的About方法。在了解了基本的URLRouting实现URL地址映射后,开发人员能够修改相应的映射规则进行更改,更改后的规则如下所示。
+展开
-C#
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default",//设置默认名称
                "{controller}/{action}.html/{id}",//修改规则
                new { controller = "Home", action = "Index", id = "" }//实现默认规则
            );
        }

  上述代码在相应的规则中进行了修改,修改规则是访问相应的Controllers中的方法名称加.html进行页面访问,这样http://localhost:2448/Home/About就不能够进行访问,因为URL Routing规则进行了更改。如果要访问相应的页面,则必须访问http://localhost:2448/Home/About.html进行页面访问,运行后如图17-24所示。
修改URL Routing
图17-24 修改URL Routing
  正如图17-24所示,在访问页面时,原有的页面再不能够进行访问,而必须通过访问/Home/About.html进行页面访问。

17.4.6 ASP.NET MVC控件辅助工具(Helper)
  在ASP.NET MVC开发模型中,由于将页面进行分层开发和呈现,开发人员在视图开发中通常是不推荐使用服务器控件的,因为在ASP.NET MVC页面是派生自ViewPage而ASP.NET WebForm是派生自System.Web.UI.Page的,同样为了规范ASP.NET MVC开发模型中页面的呈现和运行,使用服务器控件也不是最好的选择。为了能够方便的呈现控件和进行URL操作,ASP.NET MVC开发模型提供了Helper进行控件的呈现和URL操作,Helper包括HtmlHelper和UrlHelper。
1.HTML辅助工具(HtmlHelper)
  由于在ASP.NET MVC开发模型中不推荐使用服务器控件,这就会提高ASP.NET页面编程的复杂性,使用HtmlHelper能够减少相应的编程复杂性。使用HtmlHelper能够创建HTML控件并进行控件编程,在MVC编程模型中,其执行过程很像传统的ASP的执行过程。使用HtmlHelper创建HTML控件的代码如下所示。
+展开
-HTML
    <h2>HtmlHelper</h2>
    <p>
        请输入用户名:<% =Html.TextBox("Name"%> //使用TextBox
    <br>
        请输入密码:<% =Html.Password("Name"%> //使用Password
    <br>
        <input id="Submit1" type="submit" value="submit" />
    </p>

  上述代码通过HtmlHelper创建了HTML控件,HtmlHelper方法创建控件只能够在Views中使用而不能在Controllers中使用。上述代码运行后如图17-25所示。
HtmlHelper创建的HTML控件
图17-25 HtmlHelper创建的HTML控件
  注意:这里的TextBox控件和Password控件并不是ASP.NET控件,TextBox控件和Password控件分别生成的是HTML控件。
2.URL辅助工具(UrlHelper)
  UrlHelper在MVC开发框架中比较简单,UrlHelper是用来呈现相应的URL路径的,UrlHelper使用的示例代码如下所示。
+展开
-HTML
    <h2>HtmlHelper</h2>
     <p>
        <%=Url.Action("Index","Beta"%>
     </p>

  上述代码通过使用UrlHelper的Action方法进行URL的呈现,在Action方法中,其参数分别为方法名和Controller,上述代码中用于显示BetaController中的Index页面URL,运行后如图17-26所示。
UrlHelper
图17-26 UrlHelper

17.4.7 ASP.NET MVC表单传值
  ASP.NET的运行模型很像传统的ASP,在ASP.NET MVC开发模型中,由于无法使用runat=“server”进行表单传值,开发人员只能够自己编写表单进行传值。进行表单传值有两种方法,一种是编写from进行表单传值,一种是通过HtmlHelper进行表单生成和传值。编写form的表单传值方法示例代码如下所示。
+展开
-HTML
<h2>HtmlHelper</h2>
<p>
<form id="form1" method="post" action="<%=Html.AttributeEncode(Url.Action("Html","Beta")) %>">
    请输入用户名:<% =Html.TextBox("Name"%>
    <br>
    请输入密码:<% =Html.Password("Name"%>
    <br>
    <input id="Submit1" type="submit" value="submit" />
    <%=Url.Action("Index","Beta"%>
    <%= ViewData["p"%>
</form></p>

  上述代码通过传统的方法在HTML中编写from标签,而form标签的属性action需要通过使用HtmlHelper进行指定,这里指定的是BetaControllers中的Html方法进行参数传递处理。在Html方法中,可以通过编程实现相应的表单传值处理,示例代码如下所示。
+展开
-C#
        public ActionResult Html()
        {
            if (Request.HttpMethod != "POST")//判断传递方法是否为Post
            {
                ViewData["p"] = "表单还没被传递"; //填充相应的ViewData
            }
            else
            {
                ViewData["p"] = "表单已被传递";//填充相应的ViewData
            }
            return View();//返回视图
        }

  上述代码首先会判断传递的方法是否为POST,如果为POST,说明表单已经传递,否则表单还没有传递,上述代码运行后如图17-27和图17-28所示。
表单没传递
图17-27 表单没传递
表单已传递
图17-28 表单已传递
  当用户单击按钮控件时,就会进行表单的传递。在Html方法中,通过编程进行了表单传递后的操作。在MVC编程中,可以通过HttpMethod判断表单是否传递,如果传递表单,则可以通过编程的方法进行数据判断和数据操作等其他操作。在ASP.NET MVC中,还可以使用HttpHelper进行表单传值,示例代码如下所示。
+展开
-HTML
<h2>HtmlHelper</h2>
<p>
<% using (Html.BeginForm("Html""Beta"))
   { %>
    请输入用户名:<% =Html.TextBox("Name")%>
    <br>
    请输入密码:<% =Html.Password("Name")%>
    <br>
    <input id="Submit1" type="submit" value="submit" />
    <%=Url.Action("Index""Beta")%>
    <br>
    <%= ViewData["p"]%>
<%%>
</p>

  在表单创建时,HttpHelper的BeginForm方法能够创建一个Form进行表单生成,BeginForm方法包括两个参数,第一个参数为方法,第二个参数为Controllers。当运行该页面时,BeginForm方法能够创建一个Form进行表单传值。
  注意:使用BeginForm方法创建表单,而表单的结束并不是使用EndForm,使用BeginForm方法创建需要使用using{}的方法进行Form中内容容器。
  当ASP.NET MVC应用程序能够进行表单传值后,就能够通过HttpMethod进行判断,如果用户进行了提交,开发人员能够通过编程实现数据更新的插入和删除等操作。在ASP.NET MVC应用程序中,其数据通常使用LINQ进行描述和操作,关于LINQ的知识会在后面专门讲解。

加支付宝好友偷能量挖...


评论(0)网络
阅读(168)喜欢(0)Asp.Net/C#/WCF