005. 第一个MVCDemo和MvcHtmlHelper介绍及Html扩展方法

解决方案图:

1. Index.cshtml页面代码:

@{
    Layout = null;
}
<!DOCTYPE html>  //在Razor中应用命名空间
@using MVCFirstDemo.Controllers 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
       @( ViewBag.mvcFirst )
        <span name="hello" ></span>
    </div>
    @*<form action="/Home/ProcessUserRegist">*@
下面演示如何在后台拿到页面提交的数据
<form action="/Home/ProcessUserRegistClass">
    <input type="text" name="userName" value=@(ViewBag.hello) /><br />
    <input type="text" name="userPwd" value="2222" /><br />
    <input type="submit" name="btnSub" value="提交" />
</form>

 下面演示HtmlHelper方法: <br />Href的使用, 这里就不是请求一个界面了, 而是请求控制器中的一个方法<br />
    <a href="/Home/About">这是一个连接</a><br />
    <a href=@(Url.Action("About2","Home"))>我也是一个连接, 我连接到关于2页面</a>
    <br />//使用HtmlHelper的ActionLink方法<br />
    @(Html.ActionLink("超文本要显示的文字", "About3" , "Home",new
{  
    name = "小张",
    age = 10
}, new
{
    style = "color:red",
    id = 33, 
    @class="classname"
}))
<br />
    第一个参数: 超文本要显示的文字  要展示的文本
    <br />第二个参数: About3 控制器中对应的Action的名字
    <br />第三个参数: Home  控制器的名字
    <br />第四个参数: 传递的值参数, 可以是任意类型
    <br />第五个参数: 定义样式, 当前可以使用class , 但是使用class的时候要使用@符号, 因为class是关键字
    <br /> 这个@@(Html. ) , 就是微软用来弥补mvc中不方便使用服务端控件的遗憾的, 使用Html可以点出来
    <br/>任何以前用的服务端控件, 比如CheckBox, textbox,  dropdownlist . . . 
    <br />下面演示使用DropDownList<br />
    @(Html.DropDownList("CityList"))
    <br />
    //演示自定义扩展方法
    <br />在models目录中添加一个类文件MyHtmlHelper.cs
    <br />
    使用自定义的扩展方法需要注意:<br />
    1. 在页面的头部使用@using 命名空间名字   导入命名空间
    <br /> 
    2. 在对应的views目录下的<namespaces></namespaces>节点下, 增加命名空间的配置
    <br />
    3. 生成, 关闭当前已开启的界面, 然后重新打开
    <br />
    <font style="color:red">4. 但是在扩展空间定义类中, 使用System.Web.Mvc作为空间名则完全不需要前面三步, 直接拿来使用即可</font>
    <br />
    @(Html.MyLabler("我是一个简单的扩展方法"))
    <p>备注:</p>
    <p>在aspx中冒号和等号的区别</p>
    <p>
    等号: 原封不动输出
    </p>
    <p>冒号: 将后面的字符串经过HTML Incodeing之后输出, 当然要注意路由那里, 如果路由有特殊符号, 非html的符号, 则可能会报错</p>
</body>
</html>

2. HomeController控制器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFirstDemo.Controllers
{
    /*
     		MVC中控制器的约定:
			1. 控制器必须以Controller结尾
			2. 控制器必须是一个非静态类
			3. 必须实现IController接口
         */
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {

            ViewBag.mvcFirst = "this is my first MVC project";
            ViewBag.hello = "这是我MVC的第一次";

            //这里ViewData不能使用ViewBag替换, 有时间研究下这两个的区别
            ViewData["CityList"] = new List<SelectListItem>() { new SelectListItem() { Selected = true, Text="北京",Value="1" }, new SelectListItem() { Selected = false, Text = "上海", Value = "2" }, new SelectListItem() { Selected = false, Text = "河北", Value = "3" } };

            return View();
        }

        //后台如何拿到用户提交的表单数据, 示例一(不推荐)
        public ActionResult ProcessUserRegist(FormCollection collection)
        {
            return Content("OK" + collection[0] + ",,,," + collection["userPwd"]);
            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }


        //后台如何拿到用户提交的表单数据, 示例二(最常用)
        public ActionResult ProcessUserRegist(string userName, string userPwd)
        {


            return Content("OK" + userName + ",,,," + userPwd);

            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }


        //后台如何拿到用户提交的表单数据, 示例三
        public ActionResult ProcessUserRegistClass(ParaClass pc)
        {


            return Content("OK" + pc.userName + ",,,," + pc.userPwd+"我是类型调用");

            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }



        public ActionResult About()
        {

            return Content("大家好"); 
        }

        public ActionResult About2()
        {

            return Content("大家好, 我是关于2页面");
        }

        public ActionResult About3(string name, string age)
        {

            return Content(name+",,,,,,,,"+age);
        }
    }


   public  class ParaClass
    {
        public string userName
        {
            get; set;
        }
        public string userPwd
        {
            get; set;
        }
    }
}

 3. 扩展方法的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFirstDemo.Controllers
{
    /*
     		MVC中控制器的约定:
			1. 控制器必须以Controller结尾
			2. 控制器必须是一个非静态类
			3. 必须实现IController接口
         */
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {

            ViewBag.mvcFirst = "this is my first MVC project";
            ViewBag.hello = "这是我MVC的第一次";

            //这里ViewData不能使用ViewBag替换, 有时间研究下这两个的区别
            ViewData["CityList"] = new List<SelectListItem>() { new SelectListItem() { Selected = true, Text="北京",Value="1" }, new SelectListItem() { Selected = false, Text = "上海", Value = "2" }, new SelectListItem() { Selected = false, Text = "河北", Value = "3" } };

            return View();
        }

        //后台如何拿到用户提交的表单数据, 示例一(不推荐)
        public ActionResult ProcessUserRegist(FormCollection collection)
        {
            return Content("OK" + collection[0] + ",,,," + collection["userPwd"]);
            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }


        //后台如何拿到用户提交的表单数据, 示例二(最常用)
        public ActionResult ProcessUserRegist(string userName, string userPwd)
        {


            return Content("OK" + userName + ",,,," + userPwd);

            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }


        //后台如何拿到用户提交的表单数据, 示例三
        public ActionResult ProcessUserRegistClass(ParaClass pc)
        {


            return Content("OK" + pc.userName + ",,,," + pc.userPwd+"我是类型调用");

            //Content往前台输出一个字符串, 类似于下面的两句话
            //Response.Write("OK" + userName + ",,,," + userPwd);
            //Response.End()
        }



        public ActionResult About()
        {

            return Content("大家好"); 
        }

        public ActionResult About2()
        {

            return Content("大家好, 我是关于2页面");
        }

        public ActionResult About3(string name, string age)
        {

            return Content(name+",,,,,,,,"+age);
        }
    }


   public  class ParaClass
    {
        public string userName
        {
            get; set;
        }
        public string userPwd
        {
            get; set;
        }
    }
}

 4. RouteConfig代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFirstDemo
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",//URL:http://localhost:0000/Home/Index/id参数

                //下面这行设置默认值, 这就是如果只请求域名, 那么默认将请求Home/Index
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

 5. web.config部分代码

    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="MVCFirstDemo" />
        <add namespace ="MVCFirstDemo.Models"/>
      </namespaces>
    </pages>

 6. 备注:

MVC三层模型,

         v 视图层→ 就是单单指的是Html , aspx控件 , 标识页面如何展示

         c 控制器层→调用业务逻辑, 处理用户的请求数据, 然后把数据交给View展示; 代码后置的控制逻辑            controller层

         m 业务逻辑层, 数据库访问层, 数据模型层

MVC中控制器的约定:

         1. 控制器必须以Controller结尾

         2. 控制器必须是一个非静态类

         3. 必须实现IController接口

         4. 控制器下面所有的方法都称为ActionResult

         5. 所有控制器指定的视图, 都必须在Views文件夹下有对应的文件夹, 控制器中所有的方法,在该文件夹下有对应的文件

         6. Views文件夹下, 只能有一个文件夹可以不在控制器中, 就是Shared目录

posted on 2017-02-14 16:02  印子  阅读(151)  评论(0)    收藏  举报

导航