2

MVC-3 プロジェクトと MVC-4 プロジェクトの両方で動作する HtmlHelper ライブラリを作成しようとしています。

ライブラリ内のフレームワーク参照を MVC-2 に設定することで、MVC-2 と MVC-3 の間で互換性のあるライブラリを取得できましたが、MVC-2 は問題ではありません。

ライブラリのフレームワーク参照を MVC-3 に設定すると、MVC-4 プロジェクトがヘルパーの 1 つを使用すると、ヘルパー ライブラリのメソッドが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)

そして、メソッドのこの時点で null 参照例外が発生します。

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 アプリ内で同じように 1 つのフィールド ( 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 を参照している場合、ライブラリのコンシューマーはそれを使用する必要があるため、これを行うことはできません<bindingRedirect>。 MVC の 2 つのバージョン。

正直、そんなことは忘れてください。ライブラリの 2 つの異なるバージョンを出荷するか、より高度な出荷メカニズム (DLL のコピー ペーストよりも) を使用している場合は、ヘルパーの 2 つの異なる NuGet バージョンを出荷できます。他のみんなと同じように。たとえば、 と がUnity.MVC3ありUnity.MVC4ます。

于 2013-06-20T10:33:54.887 に答える