52

.Net 4.5にアップグレードした後、MVC4ベータプロジェクトのコンパイルに失敗します。

System.ComponentModel.DataAnnotations.CompareAttribute これは、との間の競合が原因で発生します System.Web.Mvc.CompareAttribute

System.ComponentModel.DataAnnotations.CompareAttributeMSDNのドキュメントによると:

2つのプロパティを比較する属性を提供します。

System.Web.Mvc.CompareAttributeMSDNのドキュメントには次のように書かれています。

モデルの2つのプロパティを比較する属性を提供します。

2つの違いは何ですか?また、それぞれを使用する方が「賢い」場合はどうなりますか?

10倍。

4

6 に答える 6

38

したがって、MSDNのドキュメントを見て、2つのクラスを文字通り比較すると、両方のクラスがSystem.ComponentModel.DataAnnotations.ValidationAttributeから派生していることがわかりました。実際、クラスはほとんど同じです。唯一の注目すべき違いは、MVCバージョンが次のプロパティを追加するIClientValidatableも実装していることです。

  • FormatPropertyForClientValidation-(静的メンバー)アスタリスクとドットを付加して、クライアント検証用にプロパティをフォーマットします。
  • GetClientValidationRules-指定されたモデルメタデータとコントローラーコンテキストを使用して、プロパティの値比較クライアント検証ルールのリストを取得します。

使用するクラスについては、モデルがビューに直接バインドされる場合は、MVCバージョンを使用して、クライアント側の検証を利用できるようにします。ただし、ViewModelsを使用している場合は、ComponentModelクラスを使用して、追加のプロパティの不要なオーバーヘッドを回避できます。あなたの電話!

于 2012-08-14T21:55:19.243 に答える
16

MicrosoftConnectの回避策は次のとおりです。

GavKによって2012年6月17日午前5時13分に投稿

[Compare(...)]を使用するだけでなく、[System.Web.Mvc.Compare(...)]への完全な参照を追加しました。

VS2012で私のために働きます...

于 2012-06-27T14:02:51.297 に答える
14

ヴィニーはあなたが使うべきものを除いてそれのほとんどを釘付けにしました...

ターゲットフレームワークを4.5に変更した後に競合が発生する理由は、.NET 4.5より前はSystem.ComponentModel.DataAnnotations名前空間にCompareAttributeクラスがなく、 System.Web.Mvcで定義されたクラスがギャップを埋めたためです。したがって、例として、ターゲットフレームワークを更新する前にモデルクラスで属性を使用[Compare][Required]ていた場合、アップグレード時に競合が発生しました。

モデルクラスの名前空間で他に何も使用していないと仮定すると、System.Web.Mvcそのステートメントを削除して、名前空間usingに依存させる必要がありSystem.ComponentModel.DataAnnotationsます。目立たないクライアント側の検証は、同じ名前空間からモデルのプロパティを装飾する他の属性の場合と同じように、以前とまったく同じように機能し続けます(例Required)。

于 2013-08-28T21:29:05.967 に答える
6

参照について明示的にしたい場合は、次の行を追加するだけです。

CompareAttribute=System.Web.Mvc.CompareAttributeを使用します;

于 2013-08-08T16:59:29.300 に答える
4

System.Web.Mvc.CompareAttributeVisual Studio 2013(MVC 5プロジェクト、.NET 4.5)を使用すると、IntelliSenseは非推奨であることを示唆しています。

私が使用System.ComponentModel.DataAnnotations.CompareAttributeしましたが、正常に動作します。また、クライアント側の検証も行います。

于 2013-11-29T22:14:29.857 に答える
2

この投稿では、Compare()の優先名前空間の参照をモデルの名前空間内に移動するという別の解決策も提案しています。例えば。Compare fromを使用する場合は、次をSystem.Web.Mvc使用します。

using System.ComponentModel.DataAnnotations;

namespace MyProject.MyViewModel
{
    using System.Web.Mvc;

コンパイラは、最初にモデルの名前空間内を検索します。

于 2013-06-12T14:43:02.390 に答える