日期:2014-05-16  浏览次数:21249 次

Asp.Net MVC4系列--进阶篇之Helper(1)

从本章开始,将为读者介绍MVC4中的helper使用方法

 

从sample开始

 

准备controller和Action

 

   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)。

 

准备View

 

<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。

 

下一步,创建一个inline的helper

现在希望对打印字符串数组的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>
}


 

测试:


 

实现ExternalHelper method

不想把代码coding在View里,希望写在C#里来管理,那么可以考虑实现一个External版本的:

第一步,实现一个customizehelper

 

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