上一讲我们说到用form标签访问mvc控制器以及如何正确显示视图结果,今天给大家介绍下mvc中的HTML辅助方法,以及如何用辅助方法来重写上次的form
上一讲中的form表单
<form action="control/action" method="get"> <input name="q" type="text"> <input type="submit" value="Search"> </form>
既然我们使用了mvc我们就应该尽量使用他的特性用Html辅助方法代劳上面这个form表单
@using (Html.BeginForm("Search", "Home", FormMethod.Get)) { <input type="text" name="q" /> <input type="submit" value="Search" /> }
BeginForm辅助方法询问路由引擎如何找到HomeController控制器的Search操作(也就是方法)在后台它使用RouteTable中Routes属性上名为GetVirtualPath的方法.
HTML辅助方法
HTML辅助方法是可以通过视图的HTML属性调用的方法.
@Html.TextArea("text","hello <br /> world");
Textarea 辅助方法中第二个参数是要渲染的值.上面的例子是向它的值中嵌入一些Html标记,但TextArea辅助方法将产生下面的标记:
<textarea cols="20" id="text" name="text" rows="2"> hello <br / > world </textarea>
输出值是经过HTML编码的.
在保护代码的同时,辅助方法也给出了所需程度的控制.BeginForm辅助方法的另外一个重载版本
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new { target = "_blank"} )) { <input type="text" name="q" /> <input type="submit" value="Search" /> }
在上面这段代码中,向BeginForm方法的htmlAttributes参数传递了一个匿名类型的对象.基本上所有的asp.net mvc 框架中的每一个HTML辅助方法在它的某个重载版本中都包含一个htmlAttributes参数.也有时可以再不同的重载版本中发现htmlAttributes参数类型是IDictionary<string,object>.就是(名/值)
上面代码会产生这样的html结果
<form action="/Home/Search" method="get" target="_blank">
可以看到已经使用了 htmlAttributes 参数设置了 target="_blank" .在这里还要特别注意下设置class
的时候,因为class是C#语言中的保留关键字,不能用作属性标识符,所以得这样
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new { target = "_blank" , @class="editForm"} )) { <input type="text" name="q" /> <input type="submit" value="Search" /> }
在class前面加一个@符号即可,还有一个问题是在设置属性时带有连字符的名称(data-value),带有连字符的C#属性名是无效的,但所有的HTML辅助方法在渲染HTML时会将属性名中的下划线转换为连字符.
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new { target = "_blank" , @class="editForm", data_validatable="true"} )) { <input type="text" name="q" /> <input type="submit" value="Search" /> }
将会生成如下HTML代码
<form action="/Home/Search" class="editForm" data-validatatable="true" method="get" target="_blank">
今天就到这里,谢谢大家