日期:2014-05-16 浏览次数:21301 次
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