HtmlHelper库可以兼容MVC-3和MVC-4吗?

时间:2013-06-19 10:13:07

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 html-helper

我正在尝试创建一个可在MVC-3和MVC-4项目中运行的HtmlHelper库。

我已经能够通过将库中的框架引用设置为MVC-2来获得MVC-2和MVC-3之间兼容的库,但MVC-2不是问题。

如果我将库中的框架引用设置为MVC-3,当MVC-4项目使用其中一个帮助程序时,helper-library中的方法会产生Object reference not set to an instance of an object.异常。

助手有这样的签名:

public static IHtmlString InputTagFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)

此方法中出现空引用异常:

var value = expression.Compile()(htmlHelper.ViewData.Model).ToString();

因为htmlHelper.ViewData.Model是null

如果我将框架引用切换到MVC-4(和system.web.webpages到v2),它都可以在MVC-4应用程序中运行;但是,当然,它不会在MVC-3应用程序中运行。

所以,我的问题是:是否可以创建一个兼容这些fraemwork版本的HtmlHelper库,以及如何?

更新断点处辅助方法的屏幕截图,监视窗口显示htmlHelper的值......

从MVC-3应用程序调用的Helper方法:

Library helper invoked from an MVC-3 app

从MVC-4应用程序调用的Helper方法:

Library helper invoked from an MVC-4 app

...并且对于记录,模型HomePage是独立定义的,但在每个MVC应用程序中只有一个字段(TestStringField),并且控制器操作正在返回:

return View(new HomePage{TestStringField = "a string value"});

在强类型(到HomePage)Razor视图中调用帮助器的方式如下:

@Html.InputTagFor(model => model.TestStringField)   

1 个答案:

答案 0 :(得分:1)

你不能这样做,因为如果你的库引用了ASP.NET MVC 3,那么你的库的使用者应该使用它,除非......他使用<bindingRedirect>,在这种情况下,他承担责任两个版本的MVC之间可能发生的重大变化。

老实说,忘记这一点。只运送您的库的2个不同版本,或者如果您使用更高级的运输机制(比DLL的复制粘贴),您可以运送2个不同的NuGet版本的帮助程序。就像其他人一样。例如,您有Unity.MVC3Unity.MVC4