zoukankan      html  css  js  c++  java
  • Asp.Net MVC基础

    一、Application_Start  

      想着记录一下MVC的一些基础知识,但是感觉比较杂乱,那就从启动开始吧。我们启动一个MVC项目时,响应第一次请求的是Global.asax.cs文件中的Application_Start方法。我们先来看下它里面做了什么事情。

         protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();//注册区域路由
                GlobalConfiguration.Configure(WebApiConfig.Register);//注册webapi路由
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }

      该方法执行了一些初始化的工作,注册Route, Filter, Bundle。Route之前的文章已经有讲过,Filter后面再专门讲。那么Bundle是做什么的呢。它是添加了一些必要的js和css,以便在_Layout中引用,避免写很多的引入文件。

     public class BundleConfig
        {
            // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
            public static void RegisterBundles(BundleCollection bundles)
            {
                bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                            "~/Scripts/jquery-{version}.js"));
    
                bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                            "~/Scripts/jquery.validate*"));
    
                // Use the development version of Modernizr to develop with and learn from. Then, when you're
                // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
                bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                            "~/Scripts/modernizr-*"));
    
                bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                          "~/Scripts/bootstrap.js",
                          "~/Scripts/respond.js"));
    
                bundles.Add(new StyleBundle("~/Content/css").Include(
                          "~/Content/bootstrap.css",
                          "~/Content/site.css"));
            }
        }
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - 我的 ASP.NET 应用程序</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("应用程序名称", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                </div>
                <div class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                        <li>@Html.ActionLink("主页", "Index", "Home")</li>
                        <li>@Html.ActionLink("关于", "About", "Home")</li>
                        <li>@Html.ActionLink("联系方式", "Contact", "Home")</li>
                    </ul>
                </div>
            </div>
        </div>
        <div class="container body-content">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - 我的 ASP.NET 应用程序</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>

      _Layout文件中通过@Scripts.Render和@Styles.Render去引入。同时可以看到在_Layout布局页中有  @RenderBody() 和 @RenderSection("scripts", required: false)这两个,@RenderBody显示内容页的内容,@RenderSection 留给内容页添加自己需要的内容,其中required参数如果为true或留空,内容页则必须包含该section节点。

      那么这个时候可能会想_Layout文件是怎么加载的,其实是在 Views/_ViewStart.cshtml中指定的,因为MVC在渲染视图时会先去Views文件夹下找_ViewStart,在里面指定了Layout。

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

    二、数据传值的几种方式

      1、ViewData:ViewData是ViewDataDictionary类型,本质上是一个Dictionary,它的调用方式

     ViewData["User"] = new User()
      {
           Id = 7,
           Name = "张三",
           Account = "zhangshan"
      };

      取值的时候需要进行类型转换

    User userViewData = ViewData["User"] as User;

      2、ViewBag:ViewBag是dynamic类型的,它可以直接通过 点 来赋值

    ViewBag.Something = 23456;
    ViewBag.Name = "Eleven";
    ViewBag.Description = "Teacher";//js
    ViewBag.User = new User()
    {
           Id = 7,
           Name = "张三",
           Account = "",
    };

      取值的时候可以直接使用

    User userViewBag = ViewBag.User;

      3、TempData:TempData是TempDataDictionary类型,和ViewData相似,不同的是它是基于session的,可以跨action访问,而ViewData和ViewBag无法跨action。

    public ActionResult Action1{ 
     
        TempData["User"] = new User()
                {
                    Id = 7,
                    Name = "张三",
                    Account = "zhangsan",
               
                };
       return this.RedirectToAction("TempDataPage");
    }
    
    
    public ActionResult TempDataPage()
    {
         base.ViewBag.User = base.TempData["User"];
         return View();
    }

    三、Razor视图

      @字符:@是Razor中的一个重要符号,它被定义为Razor服务器代码块的开始符号。

      1. 行内标记:@DateTime.Now.ToString("yyyy-MM-dd")

      2. 单行标记:@{ string name = "张三"; string name2 = "李四";}

      3. 多行标记:

     @{
            var age = 25;
            Response.Write("Age:" + age);
      }

      4. 在遇到如if、for、while等具有"keyword(){}"形式的C#代码结构时,Razor标记可以写成"@keyword(){}"这样的特殊形式。

    @if (1 > 2)
    {
           <p>1 > 2</p>
    }
     else
    {
          <p>1 < 2</p>
    }

      5. 服务器代码里嵌入html代码

        在Razor标记的代码中如果有成对的html标记,则这个标记及其内容会被当作普通文本输出。
        在Razor标记的代码中如果有"@:",则其后的一行代码会被当作普通文本输出。
        在Razor标记的代码中如果有<text>  </text>标记,则其内容会被当作普通文本输出

     四、HtmlHelper/AjaxHelper

      @Html.ActionLink:

        ActionLink用来生成HTML中的a标签,LinkText是链接显示出的文字,如果ActionLink的参数中给出Controller则链接指向对应的Controller下的Action。如果没有给出Controller则指向当前页面对应的Controller下的Action。如果ActionLink的参数中给出要传递的参数,如id,则在链接的最后写出id值。

     @Html.ActionLink("LinkText", "RazorShow")
     @Html.ActionLink("带控制器", "ActionName", "ControllerName")
     @Html.ActionLink("带路由信息", "ActionName", new { id = 1, name = 3, age = 4, height = 5 })
      <a href="/Html/ActionName/1?name=3&age=4&height=5">带路由信息</a>
     @Html.ActionLink("链接", "action", new { id = 1, name = 3, age = 4, height = 5 }, new { @class = "classText", style = "200px", tt = "xxx" })

      @Html.RouteLink:    

        RouteLink同样是用来生成HTML中的a标签的,但是其参数和ActionLink不同,LinkText依然是链接显示的文字,而链接的其他信息则包含在RouteLink的第二个参数中。这个参数是个Object,它的action属性表示指向的Action而controller属性表示指向的Controller。如果没有controller属性则指向当前Controller。id属性则为要传递的参数。

    @Html.RouteLink("LinkText", new { action = "ActionName" })
    @Html.RouteLink("LinkText", new { action = "ActionName", controller = "ControllerName" })
    @Html.RouteLink("LinkText", new { action = "ActionName", id = 1 })

       System.Web.Mvc.Html下还有很多其他的扩展,比如 InputExtensions、FormExtensions

    @Html.DropDownList("NameId", list)
    @Html.RadioButton("NameId", "Value", true)
    @using (Html.BeginForm("PostData", "Html", FormMethod.Get))
    {
         @Html.TextBox("username")
         @Html.Password("password")
         <input type="submit" value="提交" />
    }
    
    <p>等于webform的ascx</p>
    <p>Html.RenderPartial 在指定位置添加一个view,返回void 需要放入大括号 </p>
    @{Html.RenderPartial("PartialPage", "这里是Html.RenderPartial");}
    
    <p>Html.Partial 返回的是字符串,放入当前位置</p>
    @Html.Partial("PartialPage", "这里是Html.Partial")
    
    
    <p>Html.Action 返回的是字符串,放入当前位置,需要经过action的处理</p>
    @Html.Action("Render", "Second", new { name = "Html.Action" })
    
    
    <p>Html.RenderAction 在指定位置添加一个view,返回void 需要放入大括号,需要经过action的处理</p>
    @{Html.RenderAction("Render", "Second", new { name = "Html.RenderAction" });}

      @Ajax.BeginForm:异步调用

     @Ajax.BeginForm("actionname", new AjaxOptions() { HttpMethod="Post" });

    五、分布视图: PartialView

    [ChildActionOnly]//不能被单独请求
    public ActionResult Render()
    {
         ViewBag.Name = "jesen";       
         return PartialView()  //指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效
    }
    <p>Html.RenderPartial 在指定位置添加一个view,返回void 需要放入大括号 </p>
    @{Html.RenderPartial("PartialPage", "这里是Html.RenderPartial");}
    
    <p>Html.Partial 返回的是字符串,放入当前位置</p>
    @Html.Partial("PartialPage", "这里是Html.Partial")

    <p>Html.Action 返回的是字符串,放入当前位置,需要经过action的处理</p>
    @Html.Action("Render", "Second", new { name = "Html.Action" })
  • 相关阅读:
    迭代器和生成器
    案例:复制大文件
    案例:使用seek倒查获取日志文件的最后一行
    Leetcode165. Compare Version Numbers比较版本号
    Leetcode137. Single Number II只出现一次的数字2
    Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
    Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点
    Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
    Leetcode113. Path Sum II路径总和2
    C++stl中vector的几种常用构造方法
  • 原文地址:https://www.cnblogs.com/jesen1315/p/11010832.html
Copyright © 2011-2022 走看看