2012-05-19 7 views
52

Il progetto MVC 4 Beta non viene compilato dopo l'aggiornamento a .Net 4.5.System.ComponentModel.DataAnnotations.compare vs System.Web.Mvc.Compare

Ciò accade a causa di conflitto tra System.ComponentModel.DataAnnotations.CompareAttribute e System.Web.Mvc.CompareAttribute

System.ComponentModel.DataAnnotations.CompareAttribute MSDN documentation dice:

Fornisce un attributo che mette a confronto due proprietà.

Mentre System.Web.Mvc.CompareAttribute MSDN documentation dice:

Fornisce un attributo che mette a confronto due proprietà di un modello.

Qual è la differenza tra i due e quando sarebbe "più intelligente" utilizzare ciascuno di essi?

10x.

+0

La mia risposta è utile? Se è così, sarebbe bello se tu potessi contrassegnarlo come la risposta. Grazie :) –

+0

Buona domanda. Mi stavo chiedendo quale fosse anche più intelligente. –

+0

@Josh, per favore vedi la mia risposta per maggiori dettagli sull'argomento. – joelmdev

risposta

38

Così, guardando la documentazione MSDN e facendo un lit confronto tra le due classi, ho notato che entrambe le classi sono derivate da System.ComponentModel.DataAnnotations.ValidationAttribute. In effetti, le classi sono quasi esattamente le stesse. L'unica differenza degna di nota è che la versione MVC implementa anche IClientValidatable che aggiunge le seguenti proprietà:

  • FormatPropertyForClientValidation - (membri statici) Formati della proprietà per la convalida del client anteponendo un asterisco e un punto.
  • GetClientValidationRules - Ottiene un elenco di regole di convalida del client di valore di confronto per la proprietà utilizzando i metadati del modello e il contesto del controller specificati.

Per quanto riguarda la classe da utilizzare, se il modello sarà direttamente associato a una vista, utilizzare la versione MVC in modo da poter usufruire della convalida sul lato client. Tuttavia, se si utilizza ViewModels, è possibile attenersi alla classe ComponentModel ed evitare l'inutile sovraccarico delle proprietà aggiuntive. La tua chiamata!

16

Microsoft Connect work-around è:

Pubblicato da GavK il 2012/06/17 alle 05:13

ho aggiunto un riferimento completo per [System.Web.Mvc.Compare (...)], piuttosto che usando solo [Confronta (...)]

funziona per me in VS 2012 ...

+3

- ancora non capisco qual è la principale differenza tra i due. YoYo –

+1

Come indicato nella mia risposta, la versione proveniente da System.Web.DataAnnotations sta estendendo la versione ComponentModel per abilitare alcune funzionalità del client Web. Quando le proprietà decorate con System.Web.Mvc.CompareAttribute sono associate a una visualizzazione Razor, la vista sarà in grado di generare alcuni hook di convalida JavaScript. Tuttavia, se si dovesse utilizzare System.ComponentModel.DataAnnotations.ValidationAttribute per decorare le proprietà, la vista non sarebbe in grado di eseguire la convalida sul lato client. Saresti limitato alla convalida sul lato server. –

+0

Non ha risposto alla domanda. Si sta chiedendo quale dovrebbe essere usato. –

2

Su this post, essi suggeriscono anche un'altra soluzione, che è quello di spostare il riferimento dello spazio dei nomi preferito per Confronta() all'interno dello spazio dei nomi del modello. Per esempio.se si preferisce utilizzare Confronto da System.Web.Mvc, utilizzare:

using System.ComponentModel.DataAnnotations; 

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

Il compilatore cercherà all'interno dello spazio dei nomi del modello prima.

6

Se desiderate essere espliciti circa il riferimento, si può semplicemente aggiungere questa riga:

utilizzando CompareAttribute = System.Web.Mvc.CompareAttribute;

+0

Questa soluzione funziona SE è ancora necessario avere il riferimento System.Web.Mvc come faccio nella mia classe. –

14

Vinney inchiodato la maggior parte di esso con l'eccezione di cui uno si dovrebbe usare ...

La ragione si dispone di un conflitto dopo la modifica del framework di destinazione a 4.5 è perché prima di .NET 4.5 there was no CompareAttribute class in the System.ComponentModel.DataAnnotations namespace e la classe definita sotto System.Web.Mvc riempito il vuoto. Pertanto, ad esempio se si utilizzavano gli attributi e [Required] nella classe del modello prima dell'aggiornamento del framework di destinazione, si è finito con un conflitto durante l'aggiornamento.

Supponendo che non si stia utilizzando altro nello spazio dei nomi System.Web.Mvc nella classe del modello, è necessario rimuovere tale istruzione using e lasciare che si basi sullo spazio dei nomi System.ComponentModel.DataAnnotations. La convalida non invadente sul lato client continuerà a funzionare esattamente come prima, proprio come avviene per gli altri attributi che decorano le proprietà del modello con lo stesso spazio dei nomi (ad esempio Required).

+0

Non ero a conoscenza di questo bit, @ jm2. Grazie per la correzione (e il 'at-a-boy :) –

4

Utilizzo di Visual Studio 2013 (progetto MVC 5, .NET 4.5) IntelliSense suggerisce che System.Web.Mvc.CompareAttribute è deprecato.

Ho utilizzato System.ComponentModel.DataAnnotations.CompareAttribute e funziona correttamente. Inoltre, esegue la convalida lato client!

Problemi correlati