Asp.Net MVC 模型绑定
通过实现System.Web.Mvc.IModelBinder接口,可以创建一个自定义的模型绑定器。
public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext);
IModelBinder接口定义了一个方法:BindModel,为其提供了两个参数能够用来创建与模型对象。
通过ControllerContext能够访问控制器类所具有的全部信息,包括客户端请求的细节,
它具有HttpContext属性,HttpContext又相应地有一个Session属性,该属性能够后去和设置会话。
ViewData:它返回一个ViewDataDictionary对象,ViewDataDictionary类定义了一些有用的属性,它们提供对视图模型、视图包和视图模型元数据的访问。
Keys: 为字典中的数据返回键值集合,它们可用来访问视图包属性
Model :为请求返回视图模型对象
ModelMetaData 返回一个可以用来反映模型类型的ModelMetadata对象
ModelState 返回有关模型的状态信息
在视图中可以直接通过@ViewData 和 @ViewContext.RouteData.Values.Key 访问对应的数据
部分视图:
在主视图中通过 @Html.Partial('MyPartial")调用部分视图 MyPartial
@Html.Partial("MyPartial",new []{}) 即@Html.Partial("部分视图名","部分视图模型实例")
子动作:
子动作与动作之间的关系如同部分视图与视图之间的关系
子动作典型地与部分视图相关联,但这不是必须的。
@Html.Action("子动作","控制器")
辅助器方法
内联辅助器 @helper mymethod(param){} 即在试图中定义方法供调用,内而使视图难以阅读。
联辅助器是方便的,但是它只能在声明它们的视图之中使用,而且,如果内联辅助器太复杂可能会占据视图而使视图难以阅读。
外部辅助器
外部方法其实就是辅助器的扩展方法
如:
using System.Web.MVC;
public static MvcHtmlString ListArrayItems(this HtmlHelper html, string[] list)
{
TagBuilder tag = new TagBuilder("ul");
foreach (string str in list)
{
TagBuilder itemTag = new TagBuilder("li");
itemTag.SetInnerText(str);
tag.InnerHtml += itemTag.ToString();
}
return new MvcHtmlString(tag.ToString());
}
调用 @Html.<Helper> 其中<helper>是扩展方法的名称,如@Html.ListArrayItems(list);
BeginForm辅助器方法的重载
BeginForm() 创建一个表单,回递给源动作方法(源动作方法指引发渲染该表单的动作方法)
BeginForm(action,controller)创建一个表单,回递给以字符串形式指定的动作方法和控制器
BeginForm(action,controller,method)指定form元素中method标签属性的值
BeginForm(action,controller,method,attributes)为form元素的标签属性指定一个对象,该对象的属性作为标签属性的名称
BeginForm(action,controller,routeValues,method,attributes)能够为应用程序路由配置中的路由片段变量指定一个值,这个值作为一个对象,该对象的属性对应于路由变量。
基本的Input Html辅助器元素
Check box @Html.CheckBox("myCheckBox",false) <input id="myCheckBox" type="checkbox" value="false" />
Hidden field @Html.Hidden("myHidden","val")
Radio button @Html.RadioButton("myRadioButton","val",true)
Url和Ajax辅助器方法
渲染Urls的Html辅助器
相对于应用程序的URL Url.Content("/Content/Site.css") /Contetn/Site.css
链接到指定的动作/控制器 @Html.ActionLink("My Link","Index","Home") <a href="/">My Link</a>
动作Url Url.Action("GetPeople",People") People/GetPeople
使用路由数据的Url Url.RouteUrl(new {controller="People",action="GetPeople"}) /People/GetPeople
使用路由数据的链接 @Html.RouteLink("My Link",new {controller="People",action="GetPeople"}) <a href="/People/Getpeople">My Link</a>
链接到指定的路由 @Html.RouteLink("My Link","FormRoute",new {controller="People",action="GetPople"} 输出同上,使用路由配置FormRoute
@using(Ajax.BeginForm("GetPeopleData",new AjaxOptions{ UpdateTargetId="tableBody"})
MVC框架支持Ajax表单的核心在于Ajax.BeginForm辅助器方法,它可以接受一个AjaxOptions对象作为其参数。
AjaxOptions属性
Confirm 在形成Ajax请求之前,设置显示给用户的确认窗口中的消息
HttpMethod 设置用来形成请求的Http方法-必须是Get或Post
InsertionModel指定从服务器接受的内容以何种方式插入到Html。三种选择被表示成InsertionModel枚举值中的值:InsertAfter、InsertBefore、和Replace(默认值)
LoadingElementId 指定Html元素的ID,这是执行Ajax请求期间要显示的Html元素
LoadingElementDuration 指定动画的持续时间,用于显露由LoadingElementId指定的元素
UpdateTargetId 设置Html元素的ID,从服务器接收的内容将被插入到该元素中
Url设置所请求的服务器Url
AjaxOptions回调属性
属性 jQuery(javascript)事件 描述
OnBegin beforeSend 在发送请求之前立即调用
OnComplete complete 请求成功时调用
OnFailure error 请求失败时调用
OnSuccess success 请求完成时调用,不管请求时成功还是失败
用过jQuery ajax调用的都知道,这些事件不过是对匿名方法的封装:
$.ajax{
type:"post",
url:"",
data:{},
success:function(data){},
error:function(request,error){}
}
对JSON的支持
public JsonResult GetJsonData()
{
return Json(data,JsonRequestBehavior.AllowGet);
}
DefaultModelBinder类查找参数数据顺序
Request.Form 由用户在Html的form表单元素中提供的值
RouteData.Values 用应用程序路由获得的值
Request.QueryString 包含在请求Url中的查询字符串部分的数据
Request.Files 请求中上传的文件 如File()
DefaultModelBuilder会为id参数查找一下的一个值:
1.Request.Form["id"]
2.RouteData.Values["id"]
3.Request.QueryString["id"]
4.Rquest.Files["id"]
只要找到一个值,搜索便停止。
在依靠默认模型绑定器的情况下,重要的是动作方法参数与寻找的数据属性相匹配。
注意:模型绑定需要使用的命名空间
System.ComponentModel; 定义[DisplayName("标题")] 使用方法 @Html.DisplayNameFor(m=>m.FieldName)
System.ComponentModel.DataAnnnotations; 标记验证
@using (Html.BeginForm("DisplaySummary","Home")){} 指定提交数据的目标动作方法
public ActionResult DisplaySummary([Bind(Prefix ="HomeAddress")] AddressSummary summary)
{
return View(summary);
}
通过使用[Bind(Prefix="HomeAddress")] AddressSumary summary 来给参数summary 增加默认前缀,即出入的类型为HomeAddress.City HomeAddress.Country
而过滤掉前缀HomeAddress后的数据结构为AddressSummary类型。
模型验证
明确的验证视图 使用ModelState 对象记录验证错误
生成验证错误摘要 使用Html.ValidationSummary 辅助器
显示属性级验证错误 使用Html.ValidationMessageFor辅助器方法
在模型类中定义验证规则 将注解属性运用于模型类属性
创建自定义验证注解属性 派生ValidationAttribute类
定义自验证模型 实现IValidationAttribute类
使用客户端验证 向应用程序添加微软渐进包式验证包
执行远程验证 定义返回JsonResult的动作方法并为验证属性添加Remote注解属性
.input-validation-error{border:2px solid #f00;}
输入框验证错误样式
.input[type="checkbox"].input-validation-error{} 复选框运用样式
@Html.ValidationSummary() 验证辅助器 给用户显示了验证错误的摘要。
模型绑定验证
[Required(ErrorMessag="")] 注解属性指明,如果用户未提交一个属性的值,便是一个验证错误
[Range] 例:
[Range(typeof(bool),"true","true",ErrorMessage ="you must accept the terms")]
public bool TermsAccepted { get; set; }
Range注解属性指明可接受值得一个子集。
内建的验证注解属性
属性 实例 描述
Compare [Compare("MyOtherProperty")] 两个属性必须有同样的值。
Range [Range(10,20)] 一个数字值,(或实现IComparable的任何属性类型),必须不超出指定的最小值和最大值。为了指定只有一段的边界,可以用MinValue或MaxValue
如[Range(int.MinValue,50)]
RegularExpression [RegularExpression("parttern")] 一个字符串值,必须匹配指定的正则表达式。默认大小写敏感,可以运用(?i)修饰符,使大小写不敏感 如[RegularExpression("(?i)myparttern")]
[Required] [Required(ErrorMessage="")] 必须是一个非空值或一个不是只含空格的字符串,如果你希望空格作为接受值,可以用[Required(AllowEmptyString=true)]
StringLength [StringLength(10)] 一个字符串必须不超过指定的最大长度,也可以指定一个最小长度 [StringLength(10,MinimumLength=2)]
Razor小节定义:
在布局器中定义如下
@RenderSection("Scripts",false) //javascript 即js 部分引用结束
@RenderSection("Body") //代替@RenderBody()
Razor部分代码
@section Scripts{
<div></div>
}
@section Body{
}
1.AjaxOptions ajaxOpts=new AjaxOptions{
OnSuccess="processResponse" //当提交成功时触发js方法
}
@section Scripts{
<script type="text/javascript">
function processResponse(){
}
</script>
}
@Html.ValidationSummary(true) //启动客户端验证
@Html.ValidationMessageFor(m=>m.ClientName) //验证字段,错误时输出
<style>
.field-validation-error{color:#f00;}
</style>