在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、ASP.Net MVC简介 在View/文件夹名字 下创建视图Index(和XXXController的Index方法一致) 代码: public class TestControler:Controller { public ActionResult Index(IndexReqModel model) { IndexReqModel resq = new IndexReqModel(); resq.num1 = model.Num1; resq.num2 = model.Num2; resq.result = model.Num1 + model.Num2; return View(resq); } }
4,Index.cshtml的代码 @model Test1.Models.IndexReqModel <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <input type="text" value="@Model.Num1" />+<input type="text" value="@Model.Num2" />[email protected] </div> </body> </html>
5,在浏览器访问:http://localhost:56919/Test/Index?num1=1&num2=2 1,语法简单: @{string a = "abc";} @a @{C#代码块} //有标签的就是html代码 @Model //控制器传递来的对象 @Model.dog.Name //控制器传递来的dog对象的Name属性的值 @if(),@foreach()等C#语句 3,在代码中输入大段文字 if(Model.IsOK) { @:文字 } 2,<html标签>文字</html标签> if(Model.IsOK) { <span>文字</span> } razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。 例子: 技巧: 不确定的地方就加上(),也可以按照编辑器的代码着色来进行分辨 <li>[email protected]</span>//会把@item.Length识别成邮箱, 因此用上()成为: <li>item_@(item.Length)</span> 8,易错: 正确的:style='display:(@message.IsHide?"none":"block")' 错误的:style="display: (@message.IsHide) ? none : block" 注意: @{ bool b1 = true; bool b2 = false; } <input type="checkbox" checked="@b1"/>//此时生成的html代码为:<input type="checkbox" checked="checked"> 这个特性避免了进行三元运算符的判断 2、如果想让被识别成html的当成C#那就用@() 3、如果想让被识别成C#的当成html,用<span>等标签,如果不想生成额外的标签,就用<text></text> 4、如果不想对内容htmlencode显示就用@Html.Raw()方法 5、属性的值如果以"~/"开头会进行虚拟路径处理 6、属性值如果是bool类型,如果是false就不输出这个属性,如果true就输出“属性名=属性名”<input type="checkbox" checked="@b1"/> 代码示例 dynamic p = new dynamic(); p.Name = "rupeng.com"; p.Hello(); 注意:即使没有成员p.Age=3;编译也不会报错,只有运行的时候才会报错 dynamic p = new System.Dynamic.ExpandoObject(); p.Name = "rupeng.com"; p.Age = 10; Console.WriteLine(p.Name+","+p.Age); 2,var类型推断 var i = 3; var s ="abc"; 编译器会根据右边的类型推断出var是什么类型 匿名类型是C#中提供的一个新语法: 用ViewBag传递数据非常方便,但是因为ASP.Net MVC中的“Html辅助类”等对于ViewBag有一些特殊约定,一不小心就跳坑了(http://www.cnblogs.com/rupeng/p/5138575.html),所以尽量不要用ViewBag,而是使用Model。 如果在cshtml中通过“@model 类型”(注意model小写)指定类型,则cshtml中的Model就是指定的强类型的,这样的cshtml叫“强类型视图”; 如果没有指定“@model 类型”, 则cshtml中的Model就是dynamic。 对于boolean类型的参数(或者Model的属性),如果使用checkbox,则value必须是“true”,否则值永远是false。对于double、int等类型会自动进行类型转换 1,一个Controller可以有多个方法,这些方法叫Action。通过“Controller名字/方法名”访问的时候就会执行对应的方法。 1,普通参数: 注意:int类型的可空问题 2,Model类。叫ViewModel。 适用于表单元素不确定、动态的情况 3,Action的方法不能重载,所以一个Controller中不能存在两个同名的Action 错误代码: 常见的应用方法: public ActionResult T1(string name,Classes className) 5,Action参数如果在请求中没有对应的值,就会去默认值: Index(string name="tom"); 6,上传文件的参数用HttpPostedFileBase类型, 执行报错,return View("Error",(object)msg) 通用的报错页面。为了防止忘了控制重载,封装成一个通用方法。 1,View()是一个方法,它的返回值是ViewResult类型,ViewResult继承自ActionResult, return Redirect("http://www.rupeng.com");//重定向到rupeng return Redirect("~/1.html");//重定向到 3,ContentResult return Content(string content,string contentType) 4,文件 return File(); 1,return File(byte[] fileContents,string contentType);//返回byte[]格式的数据 2,return File(byte[] fileContents,string contentType,fileDownLoadName);//fileDownLoadName:设定浏览器端弹出的建议保存的文件名 3,return File(Stream fileStream, string contentType) 返回Stream类型的数据(框架会帮着Dispose,不用也不能Dispose) 4,FileStreamResult return File(Stream fileStream,string contentType,string fileDownLoadName) 5, File(string fileName, string contentType)// 返回文件名指定的文件,内部还是流方式读取文件; 6, File(string fileName, string contentType, string fileDownloadName) //如果是返回动态生成的图片(比如验证码),则不用设置fileDownloadName;如果是“导出学生名单”、“下载文档”等操作则要设定fileDownloadName。 注意:如果在Controller中要使用System.IO下的File类,因为和File方法重名了,所以要用命名空间来引用了。 如果确实需要以Get方式方式,需要调用return Json(data, JsonRequestBehavior.AllowGet) 2,json字符串中属性的名字和C#中的大小写一样,不符合js中“小写开头、驼峰命名”的习惯。在js中也要用大写去处理。 3,无法处理循环引用的问题(尽管应该避免循环引用),会报错“序列化类型为***的对象时检测到循环引用” 1,Redirect(string url) 2,RedirectToAction(string actionName,string controllerName);//其实就是帮助拼接生成url,最终还是调用Redirect(), 3,两者的区别: 1、 Redirect是让浏览器重定向到新的地址;return View是让服务器把指定的cshtml的内容运行渲染后给到浏览器; 2、 Redirect浏览器和服务器之间发生了两次交互;return View浏览器和服务器之间发生了1次交互 3、 Redirect由于是两次请求,所以第一次设置的ViewBag等这些信息,在第二次是取不到;而View则是在同一个请求中,所以ViewBag信息可以取到。 4、 如果用Redirect,则由于是新的对Controller/Action的请求,所以对应的Action会被执行到。如果用View,则是直接拿某个View去显示,对应的Action是不执行的。 存入: Session["verifyCode"] = new Random().Next().ToString(); 读取: String code = (string) Session["verifyCode"]; Session["verifyCode"] = null; if(code==model.Code) { //... } ASP.Net MVC中提供了一个TempData让这一切更简单。 注意:进行asp.net mvc开发的时候尽量使用****Base这些类,不要用asp.net内核原生的类。HttpContext.Current(X) 1)在Controller中HttpContext是一个HttpContextBase类型的属性(真正是HttpContextWrapper类型,是对System.Web.HttpContext的封装),System.Web.HttpContext是一个类型。这两个类之间没有继承关系。 2)HttpContextBase能“单元测试”,System.Web.HttpContext不能。 3)怎么样HttpContextBase.Current?其实是不推荐用Current,而是随用随传递。 4)HttpContextBase的Request、Response属性都是HttpRequestBase、HttpResponseBase类型。Session等也如此。 5)如果真要使用HttpContext类的话,就要System.Web.HttpContext 示例代码: <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="Test1" /> </namespaces> </pages> </system.web.webPages.razor> 4,Layout布局文件 <select> @foreach(var p in (IEnumerable<Person>)ViewBag.list) { <option selected="@(p.Id==3)">@p.Name</option> } </select> asp.net mvc中提供了一些“Html辅助方法”(其实就是Controller的Html属性中的若干方法,其实是扩展方法)用来简化html代码的生成。 DropDownList是生成下拉列表的。 List<Person> list = new List<Person>(); list.Add(new Person { Id=1,Name="lily",IsMale=false}); list.Add(new Person { Id = 12, Name = "tom", IsMale = true }); list.Add(new Person { Id = 13, Name = "lucy", IsMale = false }); List<SelectListItem> sliList = new List<SelectListItem>(); foreach (var p in list) { SelectListItem listItem = new SelectListItem(); listItem.Selected = (p.Id==2); listItem.Text = p.Name; listItem.Value = p.Id.ToString(); sliList.Add(listItem); } return View(sliList); @model IEnumerable<SelectListItem> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>DDL</title> </head> <body> <div> @Html.DropDownList("pid", Model); </div> </body> </html> 2)DropDownList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes) <select aaa="rupeng" class="warn error" id="yzk" name="pid" onchange="javascript:alert('ok')" style="color:red"> 支持自定义属性,给你原样输出,具体什么含义自己定; public ActionResult DDL2() { List<Person> list = new List<Person>(); list.Add(new Person { Id=666,Name="zhangsan",IsMale=false}); list.Add(new Person { Id = 222, Name = "tom", IsMale = true }); list.Add(new Person { Id = 333, Name = "lucy", IsMale = false }); SelectList selectList = new SelectList(list, "Id", "Name"); return View(selectList); } @Html.DropDownList("name",(SelectList)Model); IEnumerable items参数用来显示的原始对象数据,string dataValueField为“对象的哪个属性用做生成value属性”, public ActionResult Ajax1() { return View(); } public ActionResult Ajax2() { Person p = new Person(); p.Name = "rupeng"; if (Request.IsAjaxRequest()) { return Json(p); } else { return Content(p.Name); } } 10,数据验证 public ActionResult Index(IndexModel model) { if (ModelState.IsValid) { return Content("Age=" + model.Age); } else { return Content("验证失败"); } } 在参数很多的情况下使用下面的封装的方法: public static string GetValidMsg(ModelStateDictionary modelState) { StringBuilder sb = new StringBuilder(); foreach (var propName in modelState.Keys) { if (modelState[propName].Errors.Count <= 0) { continue; } sb.Append("属性【").Append(propName).Append("】错误:"); foreach (var modelError in modelState[propName].Errors) { sb.AppendLine(modelError.ErrorMessage); } } return sb.ToString(); }
2,ASP.Net MVC提供了在服务器端验证请求数据的能力。要把对应的Attribute标记到Model的属性上(标记到方法参数上很多地方不起作用)。 b) [StringLength(100)], 字符串最大长度100;[StringLength(100,MinimumLength=10)]长度要介于10到100之间 c) [RegularExpression(@"aa(\d)+bb")] 正则表达式 d) [Range(35,88)] 数值范围。字符串长度范围的话请使用[StringLength(100,MinimumLength=10)] e) [Compare("Email")] 这个属性必须和Email属性值一样。 f) [EmailAddress] 要是邮箱地址 g) [Phone] 电话号码,规则有限 public class IndexModel { [Required] public int Age { get; set; } public long Id { get; set; } public string Name { get; set; } [StringLength(11)] public string PhoneNum { get; set; } } 3, 验证Attribute上都有ErrorMessage属性,用来自定义报错信息。ErrorMessage中可以用{0}占位符作为属性名的占位。 [Required(ErrorMessage="不能为空")] public int Age { get; set; } 4, 数据验证+Html辅助类高级控件可以实现很多简化的开发,连客户端+服务器端校验都自动实现了,但是有点太“WebForm”了,因此这里先学习核心原理,避免晕菜。 示例代码: public class QQNumberAttribute : RegularExpressionAttribute { public QQNumberAttribute() : base(@"^\d{5,10}$")//不要忘了^$ { this.ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字"; //设定ErrorMessage的默认值。使用的人也可以覆盖这个值 } } 手机号的正则表达式:@"^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$"
比如校验中国电话号码合法性 public class CNPhoneNumAttribute : ValidationAttribute { public CNPhoneNumAttribute() { this.ErrorMessage = "电话号码必须是固话或者手机,固话要是3-4位区号开头,手机必须以13、15、18、17开头"; } public override bool IsValid(object value) { if (value is string) { string s = (string)value; if (s.Length == 13)//手机号 { if (s.StartsWith("13") || s.Sta |
请发表评论