ASP.NET MVC Preview 5 から新しくリリースされたベータ版にアップグレードするときに、どのような問題またはリファクタリングを行う必要がありましたか?
19 に答える
問題番号 1: 死のイエロー スクリーン。
CS0234: The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)
解決策: プロジェクト内のすべての参照を削除して再度追加し、プログラム ファイル\asp.net\asp.net mvc beta\assemblies 内のアセンブリを参照しましたが、問題は解決しませんでした。
gacにsystem.web.mvc dllがありました(方法がわかりません)。それを削除しようとしました。できません。1 つ以上のアプリケーションでアセンブリが必要です。ここで説明されているようにアセンブリを見つけて、レジストリ エントリを削除する必要がありました。その後、gac の system.web.mvc のバージョンを削除できました。
これでも問題は解決しませんでした。参照を再度追加する必要がありました。今、その作業。
ただ明確にします!!!System.Web.Mvc の古いバージョンは GAC にありましたが、ベータ アセンブリは Program Files の下にドロップされました。
私はこれを自分でやろうとしています。readmeからの変更点のリストは次のとおりです。
CodePlexPreview5とBetaの間で行われた変更
- デフォルトの検証メッセージをよりエンドユーザーフレンドリーになるように変更しました。
- CompositeViewEngineの名前をAutoViewEngineに変更しました。
- タイプUrlHelperのControllerにUrlプロパティを追加しました。これにより、コントローラー内からルーティングベースのURLを生成するのに便利です。
- ActionNameAttributeの基本タイプとして機能するActionNameSelectorAttribute抽象基本クラスが追加されました。この基本属性クラスから継承することにより、名前によるアクション選択に参加するカスタム属性を作成できます。
- ビューのレンダリングが完了したときにカスタムビューエンジンに通知できるようにする新しいReleaseViewメソッドがIViewEngineに追加されました。これは、クリーンアップまたはビュープーリングのシナリオに役立ちます。
- ビューエンジン用に確立されたパターンに合うように、ControllerBuilderメソッドの名前をDisposeControllerからReleaseControllerに変更しました。
- HtmlHelperクラスのほとんどのメソッドを削除し、代わりにHtmlHelperクラスの拡張メソッドに変換しました。これらのメソッドは、新しい名前空間(System.Web.Mvc.Html)に存在します。プレビュー5から移行する場合は、Web.configファイルの名前空間セクションに次の要素を追加する必要があります。
<add namespace="System.Web.Mvc.Html"/>
これにより、ヘルパーメソッドを独自のメソッドに完全に置き換えることができます。 - 複合型を処理するようにデフォルトのモデルバインダー(DefaultModelBinder)を変更しました。IModelBinderインターフェースも、ModelBindingContextタイプの単一パラメーターを受け入れるように変更されました。
最も一般的に使用されるHTTP動詞(GET、POST、PUT、DELETE、HEAD)を含む新しいHttpVerbs列挙を追加しました。また、列挙を受け入れるコンストラクターのオーバーロードをAcceptVerbsAttributeに追加しました。列挙値は組み合わせることができます。列挙に含まれていないHTTP動詞に応答できるため、AcceptVerbsAttributeは、パラメーターとして文字列の配列を受け入れるコンストラクターを保持します。たとえば、次のスニペットは、POSTリクエストとPUTリクエストの両方に応答できるアクションメソッドを示しています。
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Put)] public ActionResult Update() {... }
すべてのオーバーロードが値を受け入れるように、RadioButtonヘルパーメソッドを変更しました。ラジオボタンは可能な値のセットからの選択を指定するために使用されるため、ラジオボタンの値を指定する必要があります。
- デフォルトのプロジェクトテンプレートに変更と修正を加えました。これには、スクリプトファイルを新しいScriptsフォルダーに移動することも含まれます。デフォルトのテンプレートは、ModelStateクラスを使用して検証エラーを報告します。
アクションメソッドの選択を変更しました。2つのアクションメソッドがリクエストに一致するが、そのうちの1つだけが、リクエストに一致するActionMethodSelectorAttributeから派生した属性を持っている場合、そのアクションが呼び出されます。以前のリリースでは、このシナリオで例外が発生していました。たとえば、次の2つのアクションメソッドが同じコントローラーにあります。
public ActionResult Edit() { //... } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(FormCollection form) { //... }
プレビュー5では、2つのメソッドがリクエストに一致するため、編集アクションのPOSTリクエストにより例外が発生します。ベータ版では、AcceptVerb属性を介して現在のリクエストに一致するメソッドが優先されます。この例では、最初のメソッドは、編集アクションに対する非POST要求を処理します。
- フォーマット文字列を受け入れるViewDataDictionary.Evalメソッドのオーバーロードを追加しました。
- ViewContextクラスからViewNameプロパティを削除しました。
- デフォルトの実装であるDefaultValueProviderとともに、値プロバイダー用のIValueProviderインターフェイスを追加しました。値プロバイダーは、モデルオブジェクトにバインドするときにモデルバインダーによって使用される値を提供します。ControllerクラスのUpdateModelメソッドが更新され、カスタム値プロバイダーを指定できるようになりました。
私はWillと同じ問題を経験し、dll を bin フォルダーにコピーするなど、彼と同じようなことをしなければなりませんでした。
現在、内部の vs.net サーバーで動作していますが、IIS7 がクラッシュしています。
わかりました、主な問題の 1 つは、 web.config でコンパイル アセンブリを更新する手順を忘れたことです。
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
私がしなければならなかったのは、からアセンブリを更新することだけでした
%ProgramFiles%\ Microsoft ASP.NET \ASP.NETMVCベータ版
また、 codeplexから最新のMicrosoft.Web.MVCを取得します
私の先物アセンブリも更新します。
web.configに2行追加します
<assemblies>
セクションへのこれ:
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
セクションへのこれ<namespaces>
:
<add namespace="System.Web.Mvc.Html"/>
それから私はすべてを更新しなければなりませんでし<%using (Html.Form())
た<%using (Html.BeginForm())
1つのコードファイルにSystem.Web.Mvc.Html;
名前空間を追加する必要がありました
私のものはRobConeryのMVCストアフロントに基づいているので、それを使用している人は誰でも上記に従うことができるはずです。
それが誰かを助けてくれることを願っています。
これを無視してください...私は敗者です-プログラムファイル内のMicrosoftASP.netです...ASP.netだけではありません
これは2番目の質問かもしれませんが、すべてを1か所にまとめておくと役立つと思います。
ベータインストーラーを実行すると、PCで何も変更されません。ProgramFilesフォルダーにフォルダーが表示されません...GACにアセンブリが追加されていません...インストーラーでさえ最後のステップに到達し、約10分間ハングします。
運が悪かったので、アンインストールして再インストールしました。
同様の問題を抱えている人はいますか?
AutoFac の問題は、AutoFac コード ベース http://code.google.com/p/autofac/issues/detail?id=86&can=1の Revision 454 で解決されました。
私が見る限り、新しいModelBinderがどのように機能するかを調べようとしています.
私の昔は次のように見えました:
public class GuestbookEntryBinder : IModelBinder
{
#region IModelBinder Members
public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
{
if (modelType == typeof(GuestbookEntry))
{
return new GuestbookEntry
{
Name = controllerContext.HttpContext.Request.Form["name"] ?? "",
Website = controllerContext.HttpContext.Request.Form["website"] ?? "",
Message = controllerContext.HttpContext.Request.Form["message"] ?? "",
};
}
return null;
}
#endregion
}
新しいものは次のようになります。
#region IModelBinder Members
public ModelBinderResult BindModel(ModelBindingContext bindingContext)
{
throw new NotImplementedException();
}
#endregion
ヒントはありますか?
Html.TextBox - 値が文字列ではなくオブジェクトになりました。したがって、隠しエラーが発生する可能性があります (コンパイル時でも実行時でもありません)。たとえば、以前にこのオーバーロードされたメソッドを使用しました Html.TextBox(string name, object htmlAttributes) 今、私の属性はテキストボックスの値に入ります。
ViewContext コンストラクターに重大な変更があります。次のように変更されました。
ViewContext(ControllerContext コンテキスト、文字列 viewName、ViewDataDictionary viewData、TempDataDictionary tempData)
に:
ViewContext(ControllerContext コンテキスト、IView ビュー、ViewDataDictionary ビューデータ、TempDataDictionary tempData)
RenderMessage メソッドで ViewContext を受け取る MvcContrib.Services.IEmailTemplateService を使用しているため、これでコードが壊れてしまいました。テンプレート名から IView を取得するには、次のことを行っています。
var view = ViewEngines.DefaultEngine.FindView(controllerContext, viewName, null);
これがベストプラクティスかどうかはわかりませんが、うまくいくようです。
一日中これに苦労した後、ここに解決策を投稿することにしました。これは Visual Studio の通常の動作なのかもしれませんが、今まで気が付きませんでした...
私の既存のプロジェクトでは、ベータ ファイルを Bin フォルダーに手動で移動する必要がありました。なんらかの理由で、参照の追加で参照するだけでは機能しませんでした...
はい、Autofac も DI コンテナーとして使用します。
この男と同じ問題を取得する
http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08
修正が可能かどうかはわかりませんが、これが修正されるまで続けることはできません......
Autofac を DI コンテナーとして使用します。コンテナー オブジェクトを破棄しようとすると、null コンテナー例外がスローされます。
オートファク問題について。MVC フレームワークのベータ リリースと互換性があるようにコントローラー ファクトリを更新する必要性について、autofac ディスカッション グループにスレッドがあります。
http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08
彼らがすぐに新しいバージョンを投稿することを願っています:-)
Preview 5 から Beta にアップグレードしたとき、ActionLink の一般的なオーバーロードを見つけるのに苦労しました。これらは ASP.NET MVC のメイン リリースには含まれていないようですが、「先物」として出荷されています。
必要なアセンブリ (Microsoft.Web.Mvc) @ http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aspnet&ReleaseId=18459を見つけました
これは壊れています:
<%=Html.TextBox("Name", new Hash(@class => "required"))%>
Preview 5 では、上記は ViewData.Model.Name の値をテキスト ボックスにバインドします。これはまだ機能します:
<%=Html.TextBox("Name")%>
ただし、html 属性を指定する場合は、次のように値も指定する必要があります。
<%=Html.TextBox("Name", ViewData.Model.Name, new Hash(@class => "required"))%>
実際、これは本当に安全ではありません。ViewData.Model が null である可能性がある場合は、次のようにする必要があります。
<%=Html.TextBox("Name", ViewData.Model == null ? null : ViewData.Model.Name, new Hash(@class => "required"))%>
この変更は、ベータ版のリリース ノートに反しているようです。
「...オーバーロードのあいまいさを減らすために...いくつかのヘルパー メソッドの値パラメーターがオブジェクトから文字列に変更されました。」
TextBox の値パラメーターは以前は文字列でしたが、オブジェクトに変更されました。そのため、あいまいさを避けるために、私が最もよく使用する 1 つのオーバーロードを削除する必要がありました。:(
IMHO、すべての HTML ヘルパー メソッドには、値を指定せずにすべてのケースでバインディングを許可するオーバーロードが必要です。そうしないと、一貫性のないビュー コードが作成され、将来の開発者が混乱することになります。
ただし、GAC からアセンブリを削除して参照を再度追加するだけでなく、ベータ インストーラーを再度実行する必要がありました (今回は適切なアセンブリを GAC に配置しましたが、ファイルを使用しているだけです)。参照)。
インストーラーを実行する前に、Preview 5 アセンブリを GAC から削除しておけば (どうやってそこに入ったのかもわかりません)、すべて問題なかったのではないかと思います。試してみる価値があります。
万一、私と同じくらい馬鹿で Vista で作業している人がいる場合は、古いアセンブリを削除するために上記のレジストリ ハッキングを行う必要はありません。管理コマンド プロンプトから gacutil を実行するだけです。どっ!
futures アセンブリ (Microsoft.Web.Mvc) の Html.Form を使用している場合、FormMethod 列挙型で名前の競合が発生する可能性があります。例えば:
Html.Form<FooController>(c => c.Bar(), FormMethod.Post, new Hash(@class => "foobar"))
これは、FormMethod が Microsoft.Web.Mvc と System.Web.Mvc の間のあいまいな参照であることを訴えます。ラムダ式を使用するオーバーライドがないため、IMHO BeginForm は実行可能なオプションを提供しないため、これは非常に悲しいことです。唯一のオプションは、リファクタリングに抵抗する魔法の文字列を使用することです。
最善の解決策は、FormMethod を使用するすべてのビューに次のコードを追加することです。
<%@ Import Namespace="FormMethod=Microsoft.Web.Mvc.FormMethod"%>
うーん。うまくいけば、これは一時的なものです。System.Web.Mvc の列挙型を使用するように先物アセンブリを変更できると思います。あるいは、式を使用するために BeginForm をオーバーロードすることをお勧めします。
空のプロジェクトの名前空間で web.config 名前空間要素を更新すると、問題が解決することがわかりました。インターフェイスの変更により、ModelBinders も更新する必要がありました。
Html.Image が壊れているようです。 プレビュー 5 の時点で、先物アセンブリに移動されました。 理由は想像できません。とにかく、エラーは次のとおりです。
Method not found: 'Void System.Web.Mvc.UrlHelper..ctor(System.Web.Mvc.ViewContext)'
私が見ることができる最善の解決策は、これを置き換えることです:
<%=Html.Image("~/Content/Images/logo.jpg") %>
これとともに:
<img src="<%=Html.ResolveUrl("~/Content/Images/logo_350.jpg")%>" />