日期:2014-05-16 浏览次数:21429 次
public class TestController : Controller
{
public ActionResult Index()
{
ViewBag.Fruits = new[] { "Apple", "Orange","Pear" };
ViewBag.Cities = new[] { "New York", "London","Paris" };
string message = "This is an HTML element: <input>";
return View("List",(object)message);
}
}
代码说明:准备了一个TestController,包含了一个Index Action(默认Action),Action中存了一些stringArray在ViewBag,返回了一个字符串(包含了htmltag)。
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
Here are the fruits:
@foreach (string str in (string[])ViewBag.Fruits) {
<b>@str </b>
}
</div>
<div>
Here are the cities:
@foreach (string str in (string[])ViewBag.Cities) {
<b>@str </b>
}
</div>
<div>
Here is the message:
<p>@Model</p>
</div>
</body>
</html>
代码说明:把Viewbag中的两个string Array打印出来,并打印出传来的message。

可以看到,View打印出了string array,并且htmltag被识别为了string。
现在希望对打印字符串数组的View中的代码做一下封装,这样可以很好的控制打印的这部分实现。
于是给出实现:
@helper ListArrayItems(string[] items) {
foreach(string str in items) {
<b>@str </b>
}
}
在打印时候,就像调用C#函数那样调用就可以了,传入ViewBag中的Array:
<div> Here are the fruits: @ListArrayItems(ViewBag.Fruits) </div> <div> Here are the cities: @ListArrayItems(ViewBag.Cities) </div>
使用helper的好处显而易见,其实就是封装带来的好处,我们可以集中对行为进行控制,例如希望显示为列表,只需要给helper改为:
@helper ListArrayItems(string[] items) {
<ul>
@foreach(string str in items) {
<li>@str</li>
}
</ul>
}

不想把代码coding在View里,希望写在C#里来管理,那么可以考虑实现一个External版本的:
Public static class MyHelpers
{
public staticMvcHtmlString ListArrayItems(this HtmlHelper html, string[] list)
{
var tag =new TagBuilder("ul");
foreach(var str in list)
{
var itemTag = new TagBuilder("li");
itemTag.SetInnerText(str);
tag.InnerHtml += itemTag.ToString();
}
return new MvcHtmlString(tag.ToString());
}
}
可以看到,实际上是对HtmlHelper的扩展,接收一个stringarray参数,打印为<ul></li>列表,使用的是TagBuilder,返回值是MvcHtmlString。
1. 在View中comment掉以前的inline版本,应用external版本的实现:
@*@helper ListArr