我正在尝试创建一个可在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的值......
...并且对于记录,模型HomePage
是独立定义的,但在每个MVC应用程序中只有一个字段(TestStringField
),并且控制器操作正在返回:
return View(new HomePage{TestStringField = "a string value"});
在强类型(到HomePage
)Razor视图中调用帮助器的方式如下:
@Html.InputTagFor(model => model.TestStringField)
答案 0 :(得分:1)
你不能这样做,因为如果你的库引用了ASP.NET MVC 3,那么你的库的使用者应该使用它,除非......他使用<bindingRedirect>
,在这种情况下,他承担责任两个版本的MVC之间可能发生的重大变化。
老实说,忘记这一点。只运送您的库的2个不同版本,或者如果您使用更高级的运输机制(比DLL的复制粘贴),您可以运送2个不同的NuGet版本的帮助程序。就像其他人一样。例如,您有Unity.MVC3
和Unity.MVC4
。