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();

}

原文地址:https://www.cnblogs.com/guozefeng/p/3209317.html