.Net 3.5 及更低版本中是否有与 MvcHtmlString 等效的方法?我用谷歌搜索并没有找到答案。我为使用 MvcHtmlString 的 MVC 3/.NET 4 创建了一个助手。但是它只能在 .NET 4 上运行。我想编写一个版本的助手,以便它可以在 Mvc 2/.net 3.5 上运行,这样我就可以在另一个使用这个运行时的项目上使用助手。我会只使用 stringbuilder 并返回 Stringbuilder.ToString 吗?
问问题
359 次
1 回答
3
MvcHtmlString
确实适用于 .NET 3.5 和 .NET 4 - 它有一个静态Create()
方法,应该用于创建一个新实例。
使用静态工厂方法的原因是,可以使用运行时检查来确定环境是 .NET 4 还是 .NET 3.5;如果环境是 .NET 4,则在运行时声明一个新类型,该类型派生自 MvcHtmlString 并实现IHtmlString
,以便<%: %>
使用编码语法编写的新响应起作用。
源代码看起来像(取自 MVC 2 源代码)
// in .NET 4, we dynamically create a type that subclasses MvcHtmlString and implements IHtmlString
private static MvcHtmlStringCreator GetCreator()
{
Type iHtmlStringType = typeof(HttpContext).Assembly.GetType("System.Web.IHtmlString");
if (iHtmlStringType != null)
{
// first, create the dynamic type
Type dynamicType = DynamicTypeGenerator.GenerateType("DynamicMvcHtmlString", typeof(MvcHtmlString), new Type[] { iHtmlStringType });
// then, create the delegate to instantiate the dynamic type
ParameterExpression valueParamExpr = Expression.Parameter(typeof(string), "value");
NewExpression newObjExpr = Expression.New(dynamicType.GetConstructor(new Type[] { typeof(string) }), valueParamExpr);
Expression<MvcHtmlStringCreator> lambdaExpr = Expression.Lambda<MvcHtmlStringCreator>(newObjExpr, valueParamExpr);
return lambdaExpr.Compile();
}
else
{
// disabling 0618 allows us to call the MvcHtmlString() constructor
#pragma warning disable 0618
return value => new MvcHtmlString(value);
#pragma warning restore 0618
}
}
于 2011-12-20T07:55:46.273 回答