《ASP.NET MVC3高级编程》学习笔记3

第5章:表单和HTML辅助方法
 
选择Get还是Post:
Get通常用于读操作。
Get请求的参数都在Url中,因此可以为Get请求创建书签,可以保留表单输入值,可作为超链接使用。
Get应该是只读操作,不应该改变服务器的状态。
 
Post通常用于写操作。
Post可以用来提交修改,密码等。
Post请求通常用于改变服务器状态的请求。
重复提交Post请求可能会产生不良后果,比如购物时产生两个订单,这点许多浏览器都会提示用户。

辅助方法:
Html属性调用Html辅助方法 (扩展HtmlHelper)
Url属性调用Url辅助方法 (扩展UrlHelper)
Ajax属性调用Ajax辅助方法(扩展AjaxHelper)
 
框架中定义的辅助方法大多都是扩展方法,默认的扩展方法都在System.Web.Mvc.Html中,
如果不喜欢可以去掉web.config里的引用,构建自己的。
 
辅助方法的一些细节:
所有的辅助方法都对模型值和特性值进行Html编码,防止XSS攻击
可以利用Html辅助方法重载里的htmlAttribute参数控制标签的其他属性。
加class的话需要写@class,因为class是关键字
另外连字符也不是合法的标示符,所以使用下划线代替,渲染时候会自动转换,如:data_validatable会变成data-validatable
 
@using(Html.BeginForm()){}
@using(Html.BeginForm("Search","Home",FormMethod.Get)){
    //调用BeginForm时候生成一个<form>
    //然后调用的返回实现了IDisposable的对象,并在Dispose中生成一个</form>
}
 

 

@Html.ValidationSummary()
用来下显示ModeState字典中验证错误信息的无序列表,
有一个bool的重载,true代表只显示模型错误,false是所有错误,
 
    ModelState.AddModelError("Test", "Test错误");//属性级错误
    ModelState.AddModelError("", "错误");//模型级别错误

 

默认会顺便渲染class="validation-summary-error"样式,当然也可自定义
 
@Html.ValidationMessage()
用来显示特定字段的模型错误
默认会顺便渲染class="field-validation-error"样式,当然也可自定义
 
@Html.Lable()
Lable的for属性设置id后,点击lable焦点会定位到id所对应的控件,
可以利用model的原数据,如[DisplayName("Genre")],将会显示Genre
 
@Html.DropDownList()/@Html.ListBox
这两个都对应<select>标签,一个单选一个多选,
和SelectListItem集合一起使用,或者使用辅助方法类SelectList/MultiSelectList来帮助构造。

@Html.CheckBox()
会多生成一个hidden元素,提供未选中时候提交的值。
 
辅助方法、模型和试图数据:
1、表单的辅助方法,如@Html.TextBox,@Html.DropDownList()等,会检查ViewData对象以获得用于显示的当前值(ViewBag中的值也可以通过ViewData得到),如下:
Controller:
public ActionResult Edit(int id)
{
    ViewBag.Price = 10;
    return View();
}

 

View:
@Html.TextBox("Price")

 

渲染结果:
<input id="Price" name="price" type="text" value="10" />

 

2、辅助方法也能看到对象中的属性,如下:
Controller:
public ActionResult Edit(int id)
{
    ViewBag.Album = new Album{ Price = 11};
    return View();
}

 

View:
@Html.TextBox("Album.Price")

 

渲染结果:
<input id="Album_Price" name="Album.Price" type="text" value="11" />

如果辅助方法在ViewData中没有找到"Album.Price"的值,就去找第一个点前面,也就是Album的值,然后在里面找点后面部分的值。

注意,渲染结果中的id属性,使用下划线(其实是HtmlHelper.IdAttributeDotReplacement的值)代替了点,因为点不是有效的id名,必须用有效的id名才能用jQuery的选择符之类的js脚本
 
3、辅助方法也能利用视图数据:
Controller:
public ActionResult Edit(int id)
{
    var album = new Album{ Price = 12};
    return View(album);
}

 

View:
@Html.TextBox("Price")

 

渲染结果:
<input id="Price" name="Price" type="text" value="12" />

 

要避免自动查找数据,可以使用辅助方法的重载,给默认值
 
强类型辅助方法:
使用lambda表达式,表达式的模型类型和页面的model一致,
方法名为原方法加For后缀,
方便重构,并且有智能感知。
 
模版辅助方法:
利用元数据和模版构建Html。
其中原数据包括关于模型值的信息(名称,类型)和模型原数据。
模版辅助方法有:@Html.Display @Html.Editor @Html.DisplayFor @Html.EditorFor
 
模版辅助方法可以通过Attrbute改变生成的Html,如:
@Html.EditorFor(m=>m.Titlt)默认显示和@Html.TextBoxFor(m=>m.Title)一样,
但是为model的Title加上注解[DataType(DataType.MultilineText)],就会变成和@Html.TextAreaFor(m=>m.Title)一样。
EditorFor方法会首先查看元数据,找到最合适的,再渲染,因此可以在部队试图做修改的情况下,改变渲染效果。
 
辅助方法和ModelState:
用来显示表单值得辅助方法也需要和ModelState交互。
ModelState是模型绑定的辅副产品,存有绑定期间检测到的所有验证错误,以及用户提交用来更新模型的原始值。(用来在提交后保留值)
辅助方法会自动地在ModelState字典中查找他们的当前值,用名称作为键,在ModelState字典中找,如果找到就用找到的值替代当前值。当ModelState包含错误时候,辅助方法还会渲染class="input-validation-error"
 
@Url.Contenr():
将相对路径转换为绝对路径
 
@Html.Partial/@{Htmt.RenderPartial()}
@Html.Partial用于将分部视图渲染为字符串
@{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)
 
RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便
 
@Html.Action()/@Html.RenderAction()
和Partial与RenderPartial类似,但是因为会通过Action,所以更灵活,可以利用控制器上下文。
在Action中可以通过IsChildAction来判断是被Url直接调用还是被Action()/RenderAction()调用
可以利用重载直接参数给Action。
RenderAction优先使用ActionNameAttribute。
Action中使用return PartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。
 
4种PartialView对比:
PartialView:
<div>Just a PartialView Test!@ViewBag.Test</div>
@ViewBag.Test

 

View:
<p>
    @{Html.RenderPartial("ViewUserControl1");}
    @Html.Partial("ViewUserControl1")
    @{Html.RenderAction("ViewUserControl1");}
    @Html.Action("ViewUserControl1")
</p>

 

Controller:
Controller:
[ChildActionOnly]//防止直接调用
public ActionResult ViewUserControl1()
{
    ViewBag.Test = "(Action)调用";
    return PartialView();
}

 

        效果:
    

    

posted @ 2012-07-17 13:15  rehope  阅读(869)  评论(0编辑  收藏  举报