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

}

上一篇:Android应用启动时间及启动日志获取方法


下一篇:React 轮播图实现