一、HTML的扩展方法:
你打开我的Views文件夹下认认真真查看我的View视图,你会发现根本找不到一行类似手动书写的HTML标签集。只是看到了我这样的代码——
<%=Html.TextBox(“FinanceName”)….%>
或许你已经运行过我的程序,而且查看了源码——最终还是<input>标签集的形式输出的(废话)。于是,好事者会对比字数告诉我证明这些“小技巧”对于程序员大量代码而言只是雕虫小技而已,而技术专家则偏重说“你使用服务器代码写,是以运行速度牺牲作为你一时智能感知Coding尽兴而已……”。
诚然,偷懒的因素是有些,所以我在家也时时升级微软的IDE——哪怕一个小小的补丁而已,但为的就是加快自己的开发速度和质量的确保(因为有智能提示,所以一旦语法错误自然会有红色波浪线出现)。而且就MVC2而言,使用Html扩展方法书写定义用户交互的Html不仅仅只是一个简单的“语法糖”(Syntax Sugar)而已,在后文“数据验证”中你就知道我为什么要使用它们了。
另外需要指出的是:实际上,Html是一个属性,但是扩展方法只能对类起作用(对某个类进行附加方法),怎么可能会对一个属性附加方法呢?哦,不要被表面现象给迷惑了——Html是ViewPage类的一个属性而已,它的返回值是一个HtmlHelper类,因此是HtmlHelper方法而不是Html的属性扩展。
Html的扩展方法总共可以分成两个大的种类——HTML控件类和HTML验证控件类。我们先讲前一部分,先给出列表(仅列出默认的部分扩展方法以及第一种参数方法和说明,因为HTML控件类重载函数的形式结构大致固定类似):
1、HTML用户输入、输出控件:
<%=Html.Label(string expression)%>
<%=Html.Text(string name)%>
<%=Html.TextArea(string name)%>
<%=Html.CheckBox(string name)%>
<%=Html.RadioButton(string name,object value)%>
<%=Html..DropDownList(string name, IEnumerable<SelectListItem>)%>
…
在前面一篇中已经谈到过HTML是如何将Form中数据一同传递到被请求页面的原理,这里就简化成一个name=value的简单表示。那么现在我可以明确告诉你—— 诸如Text,TextArea,RadioButton和DropDownList中的那个name实际上就是Html中的name。
这里有一些需要提别提醒您:
v 因为Label仅仅起到输出作用,无所谓指定value(当然,HTML中也找不到对应的“只读”标签;如果你想做到同时看,数据又好被回传,不妨建议您和笔者一样,使用Hidden(string name,object value)比较好,但是紧接着使用“<%=XXX>”或者“<%=Html.Label(string expression)%>”输出某个结果即可。
v 这里的DropDownList注意——我给出的不是一个默认缺省参数,而是第三个,为什么?一般DropDownList在HTML中应用时候总是带有一个给读者看的下拉信息(就是在<select>一对标签中<option value=”xxx”>Text</option>的“Text”部分),而真正选择的(要回传的内容)则是value中的“xxx”部分。因为有时下拉列表显示的东西总是不能和要回传的值对应(尤其像笔者这种One-To-Many式样的数据表,回传的不能是一个字符串,而是一个对应的某个Id)。当然,下拉框默认应该指定一个候选的值,此时您可以使用SelectListItem.Selected = true去指定。
v 至于Checkbox中为什么没有像RadioButton一样没有value我不得而知(这就使得您不能够直接多选批量回传数据了。如果要回传数据并且使得该页面处于编辑的时候您正好可以多选,您恐怕不得不这样做:(假设有多个兴趣存在一个Hobby数据表里,Hobby已经被实例化成一个Model了)
<%foreach(var item in Model)
{%>
<input type=”checkbox” name=”hobby” value=’<%=Model.HobbyName>’/>
<%}%>
在Controller中你可以使用Request.GetValues(string name)获取批量的选择的兴趣。我猜测可以使用string[]作为Controller参数哇?因为没有尝试,所以只是参考,大伙儿(或者我)有空可以尝试一下。
二、HTML跳转方法:
在Html中扩展方法中有几个超链接方法,如ActionLink和BeginForm…EndForm等。
v ActionLink(string linkText,string actionName,string controllerName):其中后面两个参数的意思大家都明白,但是它们可以省略(第一个参数必须写,相当于<a href=…>Text</a>的Text部分)。如果只写第一个参数(假设当前的View在FinanceManager文件夹中,View的名称为“AddItem”),那么有以下情况:
扩展方法 |
生成的HTML代码 |
1) Action(“AddItem”) |
<a href=”/FinanceManager/AddItem”>AddItem</a> |
2) Action(“AddItem”,”AAA”) |
<a href=”/FinanceManager/AAA”>AddItem</a> |
2) Action(“AddItem”,”AAA”,”BBB”) |
<a href=”/BBB/AAA”>AddItem</a> |
v BeginForm和EndForm用法和Action几乎一样,只不过要提醒您它们的用法:
<%using(Html.BeginForm(….))
{
%>
…..
<%Html.EndForm()
}%>
注:此处Html.EndForm()可以省略。
三、展示和编辑控件:
主要有两个:“<%=Html.LabelForModel()%>”和“<%=Html.EditForModel()%>”,其中第一个输出所有Model中的属性名。第二个将输出一个可以编辑的列表(类似一个DetailsView),其结构是:
属性名
控件
而且更奥妙的在于控件不一定是TextBox,它会自动根据类型转换调用对应的控件,比如bool类型的就用checkbox。