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