发表评论
public static class StringHelper
{
public static string Red(this string str) {
return string.Format(@"<span style=""color:red"">{0}</span>",str);
}
}
<%= ViewData["title"].ToString().Red()%>
另外其实这个方法不是可以在ASP.NET MVC提供的HTMLHelper中重写增加吗?
@SZW
是的方法是可以的,这里只是单纯的介绍自己写Helper的方法,例子是匆忙之间想到的,未必帖切
是可以用Extension来做到HtmlHelper中的
文章说的方法侵入性比较高,要求View都继承一个新的Page。
其实可以多多利用Extension Method,例如文章里的做法。
public static StringHelper StringHelper(this Page page)
{
return new StringHelper();
}
这样代码里可以写:
StringHelper().XXX。
@Jeffrey Zhao
赵兄说的没错,这样做的确是进行扩展Helper的一种有效方法
但我感觉扩展方法有些时候毕竟有其不足
比如语义环境所限,我要自定义的Helper可能不是 Html Url Ajax中的任何一个,
如果我扩展到这些Helper中,会引起一些误会
还有就是Helper中有属性或集合,这时Extension就无能为力了
继承的确是不可取的一种方法 当然如果从组合优于继承的角度讲
在每一个ViewPage里写一个StringHelper的属性是最好的
但是这样做代码量也是不小的.
如果赵兄有更好的方法,希望一起研究^^
@重典
只要让扩展Page的方法返回我们的Helper类,所有的功能都是实现在Helper类中,不会出现属性,集合无法实现的问题的。
@Jeffrey Zhao
您指的是类似于这样的吧
class HelperExtension {
public static StringHelper(this ViewPage v){
return new StringHelper();
}
}
我总是感觉使用方法实现不如属性的优美,呵呵
收益匪浅
从LZ的文章中,更从各位的讨论中 :-)
大部分的Helper都是基于string的吗?例如通过HtmlHelper的方法DropDownList(),生成一个<select>...</select>的字符串然后输出到页面中
如果我要重新封装componentart.web.ui中的Calendar控件,作为我自己的自定义服务器端控件,该如何操作才能实现
<%=MyControl.Calendar("calendarID")%>
那就要重新写过了,不能用原来的方法了,因为原来的是用的Control类的Render来显示的,这里要用字符串
@勇敢的兽
那就要重新写过了,不能用原来的方法了,因为原来的是用的Control类的Render来显示的,这里要用字符串
在很多自己定义的控件或者方法的时候
如LZ所说先自己写一个BaseViewPage,继承MVC.ViewPage,然后自己项目中的所有Page都继承BaseViewPage,不失为一个好方法。
有没有更好的方法呢?
扩展方法 类似
static public class Include {
static public string Script(this HtmlHelper h, String fn) {
if (!fn.StartsWith("/"))
fn = string.Format("{0}Javascript/{1}.js", SiteConfig.Current.Path, fn.TrimEnd(".js".ToCharArray()));
return
string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>"
, fn);
}
static public string CSSLink(this HtmlHelper h, String fn) {
return string.Format(
"<link href=\"{0}Style/{1}/{2}.css\" rel=\"stylesheet\" type=\"text/css\" />"
, SiteConfig.Current.Path
, SiteConfig.Current.Style
, fn.TrimEnd(".css".ToCharArray())
);
}
}
我将这2个方法扩展到了HtmlHelper
则
<%=Html.CSSLink("friend")%>
<%=Html.Script("Profile")%>
就用了
呃,弱弱的问一句,怎么“扩展到了HtmlHelper” 去呢??
啊,原来是这样的啊
MVC源码中Extensions文件夹里面的全是用这种扩展的方法扩的类,我模仿学习一下
@勇敢的兽
是的,它自己也是这么用的
还有第二种方法就是生成自定义模板,不过限制太多,不推荐使用
又要麻烦你了
新增类在我自己的项目里
namespace System.Web.Mvc
{
static public class Extensions
{
static public string Test(this HtmlHelper h)
{
return "Hello";
}
static public string Test(this HtmlHelper h, string s)
{
return "Hello: " + s;
}
}
}
================================
aspx中调用
<%=Html.Test()%>
================================
报错
System.Web.HttpCompileException: e:\Project\MyMVCTest\Views\Customer\List.aspx(6): error CS0012: 类型“System.Web.Mvc.Controller”在未被引用的程序集中定义。必须添加对程序集“System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的引用。
包括我调用MVC源码中提供的CheckBox(<%=Html.CheckBox(...)%>)
也会出现这样的错误
而
<%=Html.DropDownList("CustomerID") %>
这样的就不会错
@勇敢的兽
你是不是用的preview4啊,卸载后安装preview5试试
嗯,确实是preview4,我加载preview4源码作为附加项目编译通过的
preview4就不行?
System.Web.Mvc, Version=1.0.0.0是pv5
System.Web.Mvc, Version=0.0.0.0是pv4
重新引用一下那几个文件应该也能正常使用
查看后发现 System.Web.Mvc, Version=1.0.0.0
还是没有找到错误的原因
嗯,重新引用了System.Web.Mvc 就可以了CheckBox可以,自己定义的Test()也可以
但是为什么我引用他的源码项目编译的就不行呢...下载的是Preview4的源码啊,本来想附加源码在调试的时候可以跟踪进去多学习一下的
谢谢你
得吃饭了....人是肉做的,饭是超市买的的,我不是传说中的铁做的...饭也不是传说中钢铁厂出来的