前面的一些章节中主要介绍了一些控制器和URL路径的问题,在这张中将着重介绍视图(View)的输出方法。在MVC2中微软已经增强了Html控件输出的方式,您可以“完全”告别书写<input>标签集痛苦的时代了!

 

一、HTML的扩展方法:

你打开我的Views文件夹下认认真真查看我的View视图,你会发现根本找不到一行类似手动书写的HTML标签集。只是看到了我这样的代码——

<%=Html.TextBox(“FinanceName”)….%>

或许你已经运行过我的程序,而且查看了源码——最终还是<input>标签集的形式输出的(废话)。于是,好事者会对比字数告诉我证明这些“小技巧”对于程序员大量代码而言只是雕虫小技而已,而技术专家则偏重说“你使用服务器代码写,是以运行速度牺牲作为你一时智能感知Coding尽兴而已……”。

诚然,偷懒的因素是有些,所以我在家也时时升级微软的IDE——哪怕一个小小的补丁而已,但为的就是加快自己的开发速度和质量的确保(因为有智能提示,所以一旦语法错误自然会有红色波浪线出现)。而且就MVC2而言,使用Html扩展方法书写定义用户交互的Html不仅仅只是一个简单的“语法糖”(Syntax Sugar)而已,在后文“数据验证”中你就知道我为什么要使用它们了。

另外需要指出的是:实际上,Html是一个属性,但是扩展方法只能对类起作用(对某个类进行附加方法),怎么可能会对一个属性附加方法呢?哦,不要被表面现象给迷惑了——HtmlViewPage类的一个属性而已,它的返回值是一个HtmlHelper类,因此是HtmlHelper方法而不是Html的属性扩展

 

Html的扩展方法总共可以分成两个大的种类——HTML控件类和HTML验证控件类。我们先讲前一部分,先给出列表(仅列出默认的部分扩展方法以及第一种参数方法和说明,因为HTML控件类重载函数的形式结构大致固定类似):

1HTML用户输入、输出控件:

<%=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,RadioButtonDropDownList中的那个name实际上就是Html中的name

这里有一些需要提别提醒您:

v 因为Label仅仅起到输出作用,无所谓指定value(当然,HTML中也找不到对应的“只读”标签;如果你想做到同时看,数据又好被回传,不妨建议您和笔者一样,使用Hidden(string name,object value)比较好,但是紧接着使用“<%=XXX>”或者“<%=Html.Label(string expression)%>”输出某个结果即可。

v 这里的DropDownList注意——我给出的不是一个默认缺省参数,而是第三个,为什么?一般DropDownListHTML中应用时候总是带有一个给读者看的下拉信息(就是在<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中扩展方法中有几个超链接方法,如ActionLinkBeginForm…EndForm等。

v ActionLink(string linkText,string actionName,string controllerName):其中后面两个参数的意思大家都明白,但是它们可以省略(第一个参数必须写,相当于<a href=…>Text</a>Text部分)。如果只写第一个参数(假设当前的ViewFinanceManager文件夹中,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 BeginFormEndForm用法和Action几乎一样,只不过要提醒您它们的用法:

<%using(Html.BeginForm(….))

{

%>

…..

<%Html.EndForm()

}%>   

注:此处Html.EndForm()可以省略。

 

三、展示和编辑控件:

     主要有两个:“<%=Html.LabelForModel()%>”和“<%=Html.EditForModel()%>”,其中第一个输出所有Model中的属性名。第二个将输出一个可以编辑的列表(类似一个DetailsView),其结构是:

属性名

控件

   而且更奥妙的在于控件不一定是TextBox,它会自动根据类型转换调用对应的控件,比如bool类型的就用checkbox

posted on 2009-11-26 17:02  maledong  阅读(2285)  评论(0编辑  收藏  举报