2

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

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

如果我将库中的框架引用设置为 MVC-3,当 MVC-4 项目使用其中一个助手时,助手库中的方法会引发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 应用程序中工作。

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

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

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

从 MVC-3 应用程序调用的库助手

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

从 MVC-4 应用程序调用的库助手

...并且作为记录,模型HomePage是独立定义的,但在每个 MVC 应用程序内部都是相同的,只有一个字段 ( TestStringField),并且控制器操作因此返回:

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

当从强类型(to HomePage)Razor 视图中调用助手时,如下所示:

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

1 回答 1

1

您不能这样做,因为如果您的库引用 ASP.NET MVC 3,那么您的库的使用者应该使用它,除非......他使用 a<bindingRedirect>在这种情况下,他将承担可能在2个版本的MVC。

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

于 2013-06-20T10:33:54.887 回答