zoukankan      html  css  js  c++  java
  • asp.net MVC2.0学习笔记

    asp.net;与mvc都是不可替代的;只是多一种选择;(解决了许多asp.net的许多缺点)

    model:充血模型。领域模型;很大程度的封装;

    控制器:处理用户的交互,处理业务逻辑的调用,指定具体的视图来展示数据;

     

    mvc:其实就是前台和后台松耦合;不是集成关系了,相当于回归;到<% for(var i in list) {%>;

    实现了后台不干预前台业务逻辑;

    控制器:必须以Controller结尾;所有方法都成为acion,就是一个请求;必须实现

    必要三点:实现icontroller接口,不能静态;ation,(Controller结尾)

    每个控制器都对应自己的文件夹;

    控制器指定视图来展示数据,如果没有指定名字,就用当前action名字座位veiw的名字;(约定)

    到指定路径下面的搜索相应的aspx页面,如果自己控制器视图文件夹,里面没有去shared黎明去搜索

    aspx,打断点:选中按f9,或是在冒号后面错行;,点击边缘设置断点;

    约定大于配置;struct.spring都需要配置;

    application_start:一般配置静态变量,只执行一次;除非appdomin卸载;

    mvc请求的是控制器的路由的action;

    webform请求的是页面;

    url:地址是不区分大小写的;

    aspx;就是现实数据的模板;跟请求没关系;

    webform所有的请求都归到了aspx;页面上;

    mvc都放到了控制器上;

    请求;

     <form action="/Home/My2" method="get" enctype="application/x-www-form-urlencoded">

             小人:<input name="ina" type="text" />

             大人:<input name="inb" type="text" />

             <input value="tijiao" type="submit" />

     </form>

     

    方法中;   string s = Request["ina"];

                return Content(s);//便可以输出;

    --------------------------------------------

    ----------------------------------------------第三天(2013-3-27)

      <a href="/user/index">跳转</a>

      <a href='<%: Url.Action("Index","User") %>'>第二种跳转</a>//不受限制;

     <%: Html.ActionLink("第三中跳转","Index","User") %>

     

    mvc非常接近原生态的html,倒退到最初版本;没有viewstate;

     <%: Html.ActionLink("第三中跳转", "Index", "User", new {id="aa",Style="Color:Yellow", @class="gg"})%>

       <%: Html.ActionLink("第三中跳转", "Index", "User", new {name="guozefeng"}, new { id = "aa", Style = "Color:Yellow", @class = "gg" })%>

    rotevalue传值;

      <input value="提交" type="submit" />

                <a href="/user/index">跳转</a><br/>

                <a href='<%: Url.Action("Index","User") %>'>第二种跳转</a><br />

                <%: Html.ActionLink("第三中跳转", "Index", "User",new  {name="guozefeng"}, new{ id = "aa", Style = "Color:Yellow", @class = "gg" })%>

                <%: Html.TextBox("aa","bb",new {})%>

                <br />

                男:<%: Html.RadioButton("name1",1,true) %>

                女:<%: Html.RadioButton("name1",2,false) %>

                <br />

                <%: Html.DropDownList("guo")%>

                <br />

                <%: Html.TextBox("txt1") %>

    --------------------------------------------第四天:

    扩展方法三要素:

    静态类,静态方法,this参数;(作用能够点出来)eg:  public static string GetLable(this HtmlHelper helper, string text)

    using System.Web.Mvc;(htmlhelper)

    引入命名空间:<%@ import Namespace="MvcApplication1.Models" %>

    自定义htmlhelper类;

      public static MvcHtmlString GetLableByMVC(this HtmlHelper helper, string text)

            {

                //return ;

                return MvcHtmlString.Create(string.Format("<span>{0}</span>", text));

            }(或者返回类型是htmlstring)

    -----------------------

    helper类好处:规范化,只要改源码,全都改;

    异步:

     function Button1_onclick() {

     

                $.ajax({

                    url: "/Ajax/ShowTime",

                    contentType: "application/json;charset=utf-8",

                    data: "{}",

                    type: "POST",

                    success: function (result) {

                        alert(result);

                    },

                     error: function (error) { alert(error); }

                });

            }

    ----微软异步:

    (1)先添加两条js;

    (2)showok为函数名称;(适用于含有数多表单控件时候)

     <% using(Ajax.BeginForm("ShowTime",new AjaxOptions()

            {

                     Confirm="是否要提交啊?",HttpMethod="Post",UpdateTargetId="resultDiv",

                     InsertionMode= InsertionMode.InsertBefore,

                     OnSuccess="showOk" ,

                     LoadingElementId="loading"                                      

            }) )

            {

            %>

            <input type="submit" value="提交"/>

     

        <% } %>

    -------------$.post的用法;

      $("#btnAdd").click(function () {

                    //封装参数

                    var param = {

                        BranchName: $("#txtBranchName").val(),

                        Remark: $("#txtRemark").val()

                    };

                    //发送异步请求

                    $.post("AddBranch.ashx", param, function (data) {

                        if (data == "ok") {

                            $("#showAddDialogDiv").dialog("close"); //关闭弹出来的添加的对话框

                            //刷新表格

                            initTableList("");

                            //ruby on rails

                        }

                    });

                });

    -----------$.getjson用法

          $.getJSON("LoadAllBranch.ashx", queryParam, function (data) {

    -----------------删除异步:这两种方式都行;

      $(".delLink").click(function () {

    //                if (confirm("您确定要删除吗是?")) {

    //                    var iid = $(this).attr("hid");

    //                    var link = $(this);

    //                    $.post("/AjaxPaging/Delete","id="+iid, function (data) {

    //                        if (data == "true") {

    //                            //  删除成功!

    //                            link.parent().parent().fadeOut(1000); //指的是tr;a-td-tr;

    //                        }

    //                        else {

    //                            alert("删除失败!");

    //                        }

    //                    });

    //                }

    //                return false;

                //            });

                $(".delLink").click(function () {

                    if (confirm("您确定要删除吗是?")) {

                        var iid = $(this).attr("hid");

                        var link = $(this);

                        $.ajax({

                            url: "/AjaxPaging/Delete",

                            data:"id="+iid,

                            type: "post",

                            success: function (data) {

                                if (data == "true") {

                                    //  删除成功!

                                    link.parent().parent().fadeOut(1000); //指的是tr;a-td-tr;

                                }

                                else {

                                    alert("删除失败!");

                                }

                            }

                        });

                    }

                    return false;

                });

     

    ----------------------------$.post();//{id:1}和"id=1"这两种方式都行;可以自动装配到model为参数的函数,如果参数不对也没事;顶多不添加;参数不区分大小写;

    --------------

    -----------------juery校验:

      $(function () {

                $("#from1").validate({

                    rules: {

                        txtName: {

                            required: true,

                            rangelength: [1, 6]

                        },

                        txtPwd: {

                            required: true,

                            digits: true,

                            rangelength:[1,3]

                        }

                    },

                    messages: {

                        txtName: "必填项",

                        txtPwd: "必须位数字"

                    }

                });

            });

    -----

      .error

         {

                color:Red;

         }

     

    --------------隐式js的好处:

    1.是页面与js完全的分离;及时页面没有标签页不会报错,自己手写的会报错,出去js的话,页面也不会受影响;

    ----------实体引用;using System.ComponentModel.DataAnnotations;

     [Required( ErrorMessage="你大爷的必填啊")]

            public string Name { get; set; }

            [Required( ErrorMessage="你大爷必填")]

            [ RegularExpression(@"^d+$",ErrorMessage="必须为整数")]

            public int Age { get; set; }

    ---------mvc2中引用:

        <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>

        <script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>

        <script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

       <% Html.EnableClientValidation(); %>

    ----------实体四种验证:

      [Required( ErrorMessage="你大爷的必填啊")]

            public string Name { get; set; }

            [Required( ErrorMessage="你大爷必填")]

            [RegularExpression(@"^d+$",ErrorMessage="必须为整数")]

            [Range()]

            [StringLength()]

            public int Age { get; set; }

    ---------

     if (ModelState.IsValid)

                {

                    //校验成功

                }

    --------------自定义实体类:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.ComponentModel.DataAnnotations;

    namespace MVC3_3.Models

    {

        //之所以这样干是因为防止实体更新冲掉标识;

        [MetadataType(typeof(UserValidate))]//告诉编译器此类共享UserValidate的元数据;

        public partial class User

        {

     

        }

        public class UserValidate

        {

            [Required(ErrorMessage="大哥,你得填个数啊")]

            public string Name { get; set; }

        }

    }//这样做就可以了;

     

    ------------------------路由规则:

    首先,一个url请求通过路由器中的路由规则进行匹配,成功之后开始根据路由规则进行解析,并匹配相应的路由器和action;

    route:包含路由规,和路由Handler(职责:获取并处理httphandler请求)

    routedata:路由数据;

    routecollection:路由规则集合对象;

    routeTable:路由表;

    路由从上至下:是有顺序;

    --------指定路由约束和路由命名空间(提高了效率)

     routes.MapRoute(

               "Default1", // Route name

               "{controller}-{action}/{id}", // URL with parameters

               new { controller = "Val", action = "Index", id = UrlParameter.Optional } // Parameter defaults

               , new { controller = @"^d+$" }, new string[] { " MVC3_3.Controllers" }

    -----切记路由规则很关键,是有顺序的一旦前面匹配上,后面就不能匹配了;

    -----路由调试:

    添加引用,在start函数中写上;RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);即可;

    -------------------

    -------------------

    -----------aop:面向切面编程;

    using System.Runtime.Remoting.Messaging;

    public class MyFilter:ActionFilterAttribute(重写里面的方法);类名:MyFilter

     

    [MyFilter]

    public ActionResult Index()//过滤器;

    放到类上;所有都过滤,但遵循就近原则,只执行方法上的;

      [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]

    打在自定义的过滤器上;就可以执行所有的过滤器,而不是只执行就近原则了

    (需要注意的是执行顺序U形状,global->controller->action->action->controler-global)

     

    ---------------模板页:

    @{

        ViewBag.Title = "MuBanye1";

        Layout = "~/Views/AOP/MuBanye.cshtml";

    }

    ----

    @RenderBody();

    @RenderSection("aa");(模板页)

    @section aa

    {

      sffnfsnfffsfsnosfsffferrrrrrrrrrrr

    }(子页面)

    -----------------

    -------附加进程调试:

    避免重新生成,可以在主网站运行的情况下运行;避免因项目很大调试需要很长时间,可以附加进程的方式

    -------------------

    ----有一种解决方案:

    我们将所有的sql语句放到缓存队列中去,然后在开启一个线程定时去队列中取出定量去交个sql批量执行,主要减少

    与sql的交互次数,提高数据库的吞吐率;

    ----------savechanges之所以放入业务层,是因为可以同时执行多条后只调用一次savechanges;

    ----------------------------

    商品的sku:一个商品有多个属性组合,每个组合对应一个价位;

    --------------------------

    --------------------------  

    spring.Net+aspnetMVC+NHibernate;-->spring.Net;

     

    IOC:inversion of control:控制反转;

    本来是对象A可以自己内部new一个B,控制反转就是有一大的容器来控制产生各种实例;类似于

    大的工厂;

    DI:Dependency Injection:

    比如说bll层依赖dal,当bll实例后,所以来的对象会

    包含bll的实例,通过参数构造函数或属性注入;就

    不用外部去实例其依赖的项;

    ---------------控制反转:

    (1)添加引用;

    (2)

    <configuration>

      <configSections>

        <sectionGroup name="spring">

          <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>

          <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />

        </sectionGroup>

      </configSections>

      <spring>

        <context>

          <resource uri="config://spring/objects"/>

        </context>

        <objects xmlns="http://www.springframework.net">

          <object name="User" type="控制反转IOC.User, 控制反转IOC">

          </object>

        </objects>

      </spring>

    </configuration>

    (3)创建上下文

     IApplicationContext ac = ContextRegistry.GetContext();

                if (ac != null)

                {

                    User u = ac.GetObject("User") as User;

                    MessageBox.Show(u.ShowMessage());

                }

                else

                {

                    MessageBox.Show("Error");

                }

    (4配置注入),属性注入;

     <object name="User" type="控制反转IOC.User, 控制反转IOC">

            <property name="Name" value="郭泽峰呢个">

     

            </property>

          </object>

    ------------------------object放到xml文件中:

    (1)复制objects节点到xml文件中;

    (2)添加引用:-----------//项目名称//程序集名称(命名空间)/文件路径;

    <resource uri="assembly://控制反转IOC/控制反转IOC/Obj.xml"/>

    (3)设置xml文件,属性,始终复制;嵌入资源;

    --------------构造函数注入:

     <object name="Order1" type="控制反转IOC.Order1, 控制反转IOC">

            <constructor-arg index="0" value="郭泽峰"></constructor-arg>

            <constructor-arg index="1" value="2"></constructor-arg>

          </object>

    ----index=0:指的是第一个参数;

    ----总结:控制反转:通过容器来给我们创建实例;

              依赖注入:通过配置来告诉容器属性初始化付什么值;

    -------------------------------面向切面编程:aop;(aspect oritented programme)

    就是在执行操作之前干点事,执行之后干点事;

    --------------------

    <objects xmlns="http://www.springframework.net">

      <!--通知注入到容器里(通知类)-->

      <object name="aopAdvice" type="控制反转IOC.aopAdvice, 控制反转IOC">

      </object>

      <!--后台获取iop的名称;-->

      <object id="aopdiali" type="Spring.Aop.Framework.ProxyFactoryObject">

        <!--目标函数,最终要调用的方法-->

        <property name="Target">

          <object id="aopTarget" type="控制反转IOC.aop, 控制反转IOC"/>

        </property>

        <!--告诉将目标方法装配到注入到容器的通知类中去-->

        <property name="InterceptorNames">

          <list>

            <value>aopAdvice</value>

          </list>

        </property>

      </object>

    </objects>

    -----------

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using AopAlliance.Intercept;

    using System.Windows.Forms;

    namespace 控制反转IOC

    {

       public class aopAdvice:IMethodInterceptor

        {

           #region IMethodInterceptor 成员

     

           public object Invoke(IMethodInvocation invocation)

           {

               MessageBox.Show("调用之前");

               object result = invocation.Proceed();

               MessageBox.Show("调用后:" + result.ToString());

               return result;

           }

     

           #endregion

        }

    }

    :这就和mvc过滤器一样;

    ------------------------

    orm(对象关系映射:object relation mapping):所有实现orm的框架,都是实现了一个统一的入口,开发人员通过这一个统一的入口对表实体进行操作,然后orm框架会自动帮我们监控实体状态的编译后,然后根据失调的状态生成相应的sql脚本,然后调用底层的ado.net执行到数据库库里面去影响表的变化;

     

    ---------nhiberate;nb

    sessionFactory是针对一个数据库的;

    sessionFactory进程内部实例唯一;所有线程共享此实例;

    要使用单例模式来初始化sessionFactory;

    --------------------------------------拾楼:

      catch

                {

                    ModelState.AddModelError("Name","错误");

                    return View(role);

                }

    -------------------

      alert($(window).width());窗口的宽度;

    ---

      var obj = new Object();

    //            obj.Name = "郭泽峰";

    //            obj.Age = 32;

    ////            alert(obj.Name);

                var obj ={ Name: "郭泽峰123", Age: 32 };

                            alert(obj.Name);

    --c#

     var a=new {};

    ------------------------过滤器:

     [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]

        public class MyFilter:ActionFilterAttribute

        {

            public override void OnActionExecuting(ActionExecutingContext filterContext)

            {

                base.OnActionExecuting(filterContext);

                filterContext.HttpContext.Response.Write("我是你大爷的:执行action之前");

            }

            public override void OnActionExecuted(ActionExecutedContext filterContext)

            {

                base.OnActionExecuted(filterContext);

                filterContext.HttpContext.Response.Write("我是你大爷的:执行action之后");

     

            }

            public override void OnResultExecuting(ResultExecutingContext filterContext)

            {

                base.OnResultExecuting(filterContext);

                filterContext.HttpContext.Response.Write("我是你大爷的:返回结果(渲染画面之前)");

            }

            public override void OnResultExecuted(ResultExecutedContext filterContext)

            {

                base.OnResultExecuted(filterContext);

                filterContext.HttpContext.Response.Write("我是你大爷的:渲染画面之后");

            }

        }

    ------------------错误处理

      public class MyErrorFilter:HandleErrorAttribute

        {

            //发生错误时处理

            public override void OnException(ExceptionContext filterContext)

            {

                base.OnException(filterContext);

                //写到日志中去;

                //跳转到错误页上;

                filterContext.HttpContext.Response.Redirect("/Error.htm");

            }

        }

    -------------------性能优化解决方案:

    两台IIs服务器+两台数据库;

    (11s共享一个session);主数据库只进行增删改,并同步到从数据库;而读只从从数据库读取;极大提高效率;

    ---s锁共享锁,(读);x锁:排他锁:只有当前表没有锁时才能加上排他锁;

    所以提高数据库性能可以在锁方面下点功夫;

    当并发率高时,容易出钱死锁;

    优化:对表的操作尽量顺序一致;这样减少死锁;

    1,2,3

    3,2要改成2,3比如做表关联时;

    优化:当数据查询比较慢时:解决方案;

    当并发量较多时:解决方案:1主库(做操做),多从库(做查询);数据库集群;减少死锁;

    还可以将数据库分成文件组,放在多个磁盘上,利用多个磁头同时读数据速度加快;

    select * from table with(nolock)//当有事务更改未提交时,加上with (nolock);可以读取数据,但是会是脏数据(读到的是未提交数据);当事务回滚,数据恢复了;虽然可以提高查询效率,但会产生脏读;如果去掉with(nolock);就必须等待事务提交后才能查询;

     

    -----主库如何同步到从库?

    启用代理-->在复制--》发布订阅(主),选择表(列)---每隔多长时间发布一次;(这种方式可以做备份,主库挂了,从库不上)

    --------------(Request.Form.AllKeys,获取所有的name键值)

     string str1 = "";

                var names = from key in Request.Form.AllKeys

                            where key.Contains("a_")

                            select key;

                foreach (var str in names)

                {

                    str1 += str;

                }

                ViewData["guo"] = str1;

                ViewBag.aa = str1;

                return View();

    -------------------------------可以填充模板页的底部:

    <div style="background-color:Yellow; 300px; height:200px;">

           @RenderSection("gg");

    </div>

    子页面:

    @section gg

    {

       <h1>你大爷的</h1>

    }

    这样gg的内容会填充过去;

    --------aa可以随便起名字;

       <span>@ViewBag.aa</span>

    ------------

     

    ------------RenderAction("/Home/index");相当于用户控件;打对应的indexview填充过来;

    ---------过滤器:也是actionFilter;他继承他;

     

     

    ------------------------视图状态错误:

    public actionResult Index()

    {

       modelstate m=new modelstate();

       m.errors.add("出错了");

       modelstate["Name"]=m;

       return view();

    }

  • 相关阅读:
    Django超级用户
    12.23站立会议
    12.22站立会议
    12.21站立会议
    用户场景分析
    12.20站立会议
    12.19站立会议
    12.18战略会议
    四则运算
    MongoEngine中文文档
  • 原文地址:https://www.cnblogs.com/guozefeng/p/3209317.html
Copyright © 2011-2022 走看看