这两天刚做完一个MVC3项目,因为以前项目经验就很少,之后MVC 0基础就直接做了这个MVC3的项目,所以中间出了很多问题,所以今天就写下第一篇博文总结一下MVC3出现的问题,以及在这个项目中发现的一些小窍门。
1.在做MVC3中做无刷新
方法执行是这样的,要通过一个参数获得一个另一个参数,通过另一个参数得到另一个对象
三层中用的ajax.dll是从前往后执行的,通过i获得val1 ,然后再通过val1获得val2,返回val2,条理很清淅
1 function getHtml(i){ 2 var val1=Method1(i); 3 var val2=Method2(val1); 4 alert(val2); 5 }MVC3中是用的是jq ajax 的post方法 这个是先执行post方法体,然后直接执行后面的alert("注意这里"),之后才执行post内部,把data得到赋给val1 然后,再去执行post内部的执行方法,再去执行post(第2个),把方法体执行完再alert(val2)
1 function getHtml(i){ 2 $.post("url1",{"i":i} function(data){ 3 var val1=data; 4 $.post("url2",{"val1":val1} function(data){ 5 var val2=data; 6 alert(val2); 7 }); 8 });9 alert(" 注意这里"); 10 }
刚开始跟着一个教程做了一个MVC的demo,里面使用了mvcModel数据验证,这个东西可以实现前后台统一验证,当时觉得非常不错,前台只要写cs代码就好啦,后台也只是写几个验证字段就可以啦。
首先说下用法吧。(以下代码引用 的 )
1.引用命名空间System.ComponentModel.DataAnnotations
2.增加一些内建的Required(必须输入),StringLength(输入字符长度)与Range(输入范围)验证规则,如下代码
public class Movie { public int ID { get; set; } [Required(ErrorMessage = " 必须输入标题 ")] public string Title { get; set; } [Required(ErrorMessage = " 必须输入发行日期 ")] public DateTime ReleaseDate { get; set; } [Required(ErrorMessage = " 必须指定种类 ")] public string Genre { get; set; } [Required(ErrorMessage = " 必须输入票价 ")] [Range( 1, 100, ErrorMessage = " 票价必须在1元到100元之间 ")] public decimal Price { get; set; } [StringLength( 5,ErrorMessage = " 最多允许输入五个字符 ")] public string Rating { get; set; } }
页面只要把jq验证控件都引用进来,在每个需要验证的jq下面写个引用验证即可。
@model MvcMovie.Models.Movie @{ ViewBag.Title = " 追加电影信息 "; } <h2>追加电影信息</h2> <script src= " @Url.Content( "~/Scripts/jquery.validate.min.js " ) " type= " text/javascript "></script> <script src= " @Url.Content( "~/Scripts/jquery.validate.unobtrusive.min.js " ) " type= " text/javascript "></script> @using (Html.BeginForm()) { @Html.ValidationSummary( true) <fieldset> <legend>电影</legend> <div class= " editor-label "> 标题 </div> <div class= " editor-field "> @Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title) </div> <div class= " editor-label "> 发行日期 </div> <div class= " editor-field "> @Html.EditorFor(model => model.ReleaseDate) @Html.ValidationMessageFor(model => model.ReleaseDate) </div> <div class= " editor-label "> 种类 </div> <div class= " editor-field "> @Html.EditorFor(model => model.Genre) @Html.ValidationMessageFor(model => model.Genre) </div> <div class= " editor-label "> 票价 </div> <div class= " editor-field "> @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) </div> <p> <input type= " submit " value= " 追加 " /> </p> </fieldset> } <div> @Html.ActionLink( " 返回电影列表 ", " Index ") </div>这样就可以实现前后台统验证啦,当用户在表单内输入不符合条件的数据,自动提示报错。
当时觉得很牛X,所以就准备用在自己的项目里,可是问题重重
第一,我们用的三层做的,用的aspx引擎,两个有区别啦,连最基本的引用都总搞不懂。
第二,三层的Model层和Mvc3的Models 我到底用哪个做Model,当时就有点蒙
第三,在做页面时教程上只有lable和txt两种,如果用txtArea等我就不知道咋办啦(没办法菜鸟嘛,不知道改哪)
第四, 因为做之前Demo的时候用的Efcodefirst(自动创建数据库),所以所有验证自动匹配到数据库里面啦,所以不能随便添入不完整的数据。()
第五,一个页面只能写一个Form不能重用,如果一个页面有多个表单数据我就不会实现啦
最重要的当时是在给公司做东西,不是自己闲着没事做,可以慢慢学,慢慢做,当时已经开始那个项目啦,真的没有太多时间去研究,所以就直接用最简单的方式 FormCollection collection collection["txtlianxiren"] 这样的方式一个个的取数据,如果遇到多个form则利用传参的形式判断form是哪个,当时想用ajax实现来着,可是和三层的却完全两样,不会实现啊。
刚刚又翻了翻别人的博客,看到一个关于前台后台统一验证的博文,分享大家()
刚刚发现明白的小窃门,当然大家也许早已经知道啦,可是我刚知道,谁叫我是新手啦呢
1.在做可重复利用的小模块的时候可以在页面上拼写HTML代码拼接起来,在公用的Models建公用类输出String代码, 在页面上只要留着一个可以灌输的控件即可,比如div,span,等,因为以前总是不注意,所以经常复制粘贴代码到每个页面,最后才发现要改起来好麻烦,所以要学会把公用的东西封装起来。
2.在做显示的图片的时候直接把地址粘上就可以啦,如果找不到的就可以显示一张默认图片,用JS:onError="this.src='/Content/images/spaceimg/noneimg.jpg';" 这样就用不着在后台写xxxx=xxx:do():do2();这样的代码啦
3.
(上班啦,先写到这里,有时间继续写)