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>

posted @ 2020-09-06 11:06  丹心石  阅读(341)  评论(0编辑  收藏  举报