Эквивалент MvcHtmlString в .Net 3.5 и ниже? - PullRequest
0 голосов
/ 20 декабря 2011

Есть ли эквивалентный метод для MvcHtmlString в .Net 3.5 и ниже?Я погуглил и не нашел ответа.Я создал помощник для MVC 3 / .NET 4, который использует MvcHtmlString.Однако он работает только в .NET 4. Я хочу кодировать версию помощника, чтобы он мог работать в Mvc 2 / .net 3.5, чтобы я мог использовать помощник в другом проекте, который использует эту среду выполнения.Буду ли я просто использовать stringbuilder и вернуть Stringbuilder.ToString?

1 Ответ

3 голосов
/ 20 декабря 2011

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
    }
}
...