Asp.net Mvc Framework 八 (Helper)

本人已经疯了...快写完了而关掉浏览器丢失数据之事在此文章上发生了两次,所以本人倍加珍惜

这节讲 一下Asp.netMVC中的Helper
何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组

其实Asp.net MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢
其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View,在扩展包中,也有Castle的NVelocity引擎和Boo所以,如果在Aspx中定义方法的话会影响其扩展性和可移植性.而且代码也不太好看.

UrlHelper的Action方法 用于生成一个超级链接,它的重载为
        public string Action(string actionName);
        public string Action(string actionName, object values);
        public string Action(string actionName, RouteValueDictionary valuesDictionary);
        public string Action(string actionName, string controllerName);
        public string Action(string actionName, string controllerName, object values);
        public string Action(string actionName, string controllerName, RouteValueDictionary valuesDictionary);

例如我在View中写Url.Action("Index","Home"),运行后则会生成/Home/Index这个地址
如果你的系统中的URL Routing规则总是变化的话这个Helper则是你必备之选.
    public string Encode(string url);
这也是UrlHelper的一个方法 使用方法 如<%=Url.Encode("中文")%>功能与Server.UrlEncode相同,这里不多说了
如果你有特殊需要可以用3.0新特性,扩展方法来为UrlHelper来增加新的功能

HtmlHelper则是另一个常用之Helper
它是来生成HTML代码用的
eg.
<%=Html.ActionLink("首页","index","Home")%>
则生成<a href="/Home/Index">首页</a>
重载方法有:
public string ActionLink(string linkText, string actionName);
public string ActionLink(string linkText, string actionName, object values);
public string ActionLink(string linkText, string actionName, RouteValueDictionary valuesDictionary);
public string ActionLink(string linkText, string actionName, string controllerName);
public string ActionLink(string linkText, string actionName, string controllerName, object values);        public string ActionLink(string linkText, string actionName, string controllerName, RouteValueDictionary valuesDictionary);
当然HTMLHelper的种类就比UrlHelper多得多了
比如有Button
<%=Html.Button("name","value","onclick"%>

生成
<button onclick="onclick" name="name" id="name">value</button>

CheckBox:
<%=Html.CheckBox("name","text"%>
生成
<input value="text" name="name" type="checkbox">&nbsp;text

Form:
<%=Html.Form("Home","Index",FormMethod.Post) %>
生成
<form action="/Home" method="post">System.Web.Mvc.SimpleForm

</form>

当然还有类似于SubmitButton,Image这些方法,这里就不多讲了

注意一点Preview2中Html.Mailto方法有些Bug请尽量避免使用这个方法

吾生也有涯,而知也无涯,以有涯随无涯,殆己

附:
功能介绍还有几篇就写完了,争求意见,下面可以讲示例也可以讲对Asp.net MVC进行扩展,不知道大家想看什么,有兴趣的朋友可以回复一下,我做个参考

Asp.net Mvc Framework 系列
posted @ 2008-03-13 17:12 重典 阅读(2694) 评论(28)  编辑 收藏 所属分类: Microsoft MVC

  回复  引用  查看    
#1楼 2008-03-13 17:27 | cslar      
哈哈 楼主不要急

是不是在等我占沙发啊?
  回复  引用  查看    
#2楼 [楼主]2008-03-13 17:31 | 重典      
@cslar
兄弟这个真是水啊...爆湿的回复,呵呵
  回复  引用  查看    
#3楼 2008-03-13 17:36 | 永春      
感觉和MonoRail太像了-_-

有时间的话来点示例吧,看起来快,也直观一点的
  回复  引用  查看    
#4楼 [楼主]2008-03-13 17:39 | 重典      
@永春
和Monorail那不是一般的像,简直是同卵双生....
不过现在还没有Monorail那么方便
我刚刚回了您的帖子,一回来就看到您回了我的,真是...缘份啊
  回复  引用    
#5楼 2008-03-13 22:10 | zsj [未注册用户]
很好很不错!

建议先将几个实例,然后深入展开。

对我个人而言,前面的内容基本ok了,但是上一节的fliter部分不是很清楚,特别是实际应用,迫切希望看到这方面的例子:)谢谢楼主。

关注ing...
  回复  引用  查看    
#6楼 [楼主]2008-03-13 23:06 | 重典      
@zsj
好的,我下篇文章讲交互,然后给个Filter的示例讲解
  回复  引用    
#7楼 2008-03-14 07:15 | inhesoftvvv [未注册用户]
Monorail好象没有方法过滤器(Filter),只有Controller的过滤器,不知如何在MR中建立单独的方法过滤器,各位前辈能否指教?
  回复  引用  查看    
#8楼 [楼主]2008-03-14 08:42 | 重典      
@inhesoftvvv
你说的对,Monorail中只有Controller上可以加过滤器
但方法上可以指定Filter不生效,如
[Filter(ExecuteEnum.BeforeAction, typeof(AdminFilter))]
[Filter(ExecuteEnum.BeforeAction, typeof(LoginedFilter))]
public class UserController : BaseController
{
[SkipFilter(typeof(LoginedFilter))]//这样就可以在此方法上使LoginedFilter不生效了,如果想更多的Filter不生效,也可以写多个
public void index(){};
}

  回复  引用  查看    
#9楼 2008-03-14 09:30 | Shawn Ji      
示例好些。。但太简单的示例只能配合理论讲解而已:)

另有问题请教:在两个Controller中传值,如下:
HomeController
public void CheckIn()
{
UserItem UserItem = new UserItem();
// TODO ......

RedirectToAction(new RouteValueDictionary(new {
controller = "Chatroom",
action = "ChatroomIndex",
nickName = UserItem.NickName,
email = UserItem.EMail }));
}


ChatroomController
public void ChatroomIndex(string nickName, string email)
{
// TODO.......
}

在Global.asax中进行了多种配置,仍然无法实现,RedirectToAction出错,
其实我只需要能够使用RedirectToAction传递多个参数的方法,不知有无简单方法解决。
谢先~
  回复  引用  查看    
#10楼 [楼主]2008-03-14 09:34 | 重典      
@Shawn Ji
使用TempData即可
public void CheckIn()
{
UserItem UserItem = new UserItem();
// TODO ......
TempData["UserItem"]=UserItem;
RedirectToAction( "ChatroomIndex","Chatroom");
}


ChatroomController
public void ChatroomIndex()
{
// TODO.......
//这样在这个的View时只要TempData["UserItem"] as UserItem就可以使用了
}
  回复  引用  查看    
#11楼 2008-03-14 09:50 | Shawn Ji      
Thank you for your help!

但是看到TempData就让我想到了WebForm中使用ViewState进行存值,当然这并不相同。

有时候并不需要将UserItem中所有的值进行传递使用。
难道就没有用参数的形式进行多Value的显式传值的方法么。。
  回复  引用  查看    
#12楼 [楼主]2008-03-14 10:09 | 重典      
@Shawn Ji
你的写法并无问题,可以正常传值
可能是你的UrlRouting没有配置正确

新加一个
routes.Add(new Route("{controller}/{action}/{nickName}/{email}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Home", action = "Index", nickName= "", email= "" }),
});
应该就可以了
  回复  引用  查看    
#13楼 2008-03-14 10:17 | miao~      
强烈要求做个小的例子..如BOLG 留言板之类...
看了这么多..不知道该怎么用..用在哪..一头雾水啊..呵呵..~~最好是和LINQ结合的例子...
  回复  引用  查看    
#14楼 2008-03-14 10:22 | Shawn Ji      
@重典
这种方法我试过了,当email有值的时候会出现404的错误,无值的时候正常
因为
Requested URL: /Chatroom/ChatroomIndex/aaaaaa/aaaaa@dddf.com
(nickName:aaaaaa,email:aaaaa@dddf.com)

我也见到有的例子中使用
("{controller}/{action}/{aaaaa}/{bbbb}", 这种方式,却没搞清楚是怎样实现的~

如果要写例子的话,也请增加各种传值方式,以及分层的方法,跟楼上不同,我在使用ADO.NET Entity Framework,而不是LINQ,个人觉得ADO.NET Entity Model更有潜力。

  回复  引用  查看    
#15楼 [楼主]2008-03-14 10:26 | 重典      
@Shawn Ji
可能是@在传送时是Url不允许的
你可以将之UrlEncode试下看

  回复  引用  查看    
#16楼 [楼主]2008-03-14 10:29 | 重典      
@miao~
谢谢支持
今天事情很多,我正在写提交表单
我会写个简单的例子的...
来个留言版吧...呵呵(我可真是懒),最迟明天Post出来
  回复  引用  查看    
#17楼 2008-03-14 10:34 | Shawn Ji      
@重典
:-),是.的问题,光想着传值了,这种问题也给忽略了。
再次感谢。

  回复  引用  查看    
#18楼 [楼主]2008-03-14 12:48 | 重典      
@Shawn Ji
^^
  回复  引用  查看    
#19楼 2008-04-30 16:34 | 土星的狗狗      
实例自己来吧~呵呵

  回复  引用    
#20楼 2008-07-10 12:25 | wfa [未注册用户]
Html.ActionLink用处不大,我想给生成的a标签加target属性就没法做,只能自己扩展了。
  回复  引用  查看    
#21楼 [楼主]2008-07-10 20:19 | 重典      
@wfa
Html.ActionLink(action,controller,new{target="_blank"})
  回复  引用  查看    
#22楼 2008-07-16 15:27 | 云の世界      
除了url helper,别的helper有什么意义呢
能少用则少用吧,对网页设计人员和美工很不友好,
第三方编辑器支持也不好。

  回复  引用  查看    
#23楼 2008-07-30 16:55 | 孤独客      
--引用--------------------------------------------------
重典: @Shawn Ji<br>可能是@在传送时是Url不允许的<br>你可以将之UrlEncode试下看<br>
--------------------------------------------------------
请问再什么地方UrlEncode了?
  回复  引用  查看    
#24楼 [楼主]2008-07-30 17:36 | 重典      
@云の世界
是不友好但对于和Controller的互相作用还是有些好处的
如Select的绑定或
ViewData["X"]
对应
Html.TextBox("X")
  回复  引用  查看    
#25楼 [楼主]2008-07-30 17:39 | 重典      
比如Controller1/Action1/id id是String
我传xxx@xxx.com
其中@是非法字符
于是要将之UrlEncode
Html.Action<Controller1>(c=>c.Action1(Server.UrlEncode(id1)),"连接")

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-13 17:14 编辑过


相关链接: