Domanda

Modifica: Aggiunta di taglie perché sto cercando una soluzione MVC3 (se ne esiste uno) altro che questo:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;


Ho un solo immobile leggere sul mio 'Indirizzo' modello 'CityStateZip'.

E 'solo un modo conveniente per ottenere città, stato, zip da un indirizzo negli Stati Uniti. Si genera un'eccezione se il paese non è Stati Uniti d'America (il chiamante si suppone di controllare in primo luogo).

    public string CityStateZip
    {
        get
        {
            if (IsUSA == false)
            {
                throw new ApplicationException("CityStateZip not valid for international addresses!");
            }

            return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
        }
    }

Questo fa parte del mio modello in modo che viene legato. Prima di ASP.NET MVC2 RC2 questo campo non ha causato un problema durante l'associazione dati. Non ho mai nemmeno pensato davvero a questo proposito -. Dopo tutto è di sola lettura sola

Ora, se con il rilascio RC2 gennaio 2010 mi dà un errore durante l'associazione dati -. Becasue il legante modello predefinito sembra voler controllare questo valore (anche se è di sola lettura)

E 'la linea 'base.OnModelUpdated' che causa questo errore per essere attivato.

public class AddressModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext);

Ultimi minuti modifiche al modelbinder evidentemente causato questo cambiamento nel comportamento - ma io non sono molto sicuro ancora che cosa le repurcussions di esso sono - o se questo è un bug? Sto passando questo al team MVC, ma curioso di sapere se qualcun altro ha qualche suggerimento nel frattempo come posso evitare che questo immobile dal vincolante.

Questo articolo è ben la pena di leggere i cambiamenti - ma non menziona le proprietà di sola lettura a tutti (non che mi aspetterei a). Il problema (se ce n'è uno) potrebbe essere più ampia di quella questa situazione - non sono solo sicuro di eventuali repurcussions - se del caso

Input Validation vs Model Validation in ASP.NET MVC


Come richiesto dal @haacked ecco la stacktrace:

ottengo questo semplicemente aggiungendo la seguente riga a qualsiasi modello e fare un post per il metodo di azione corrispondente. In questo caso ho aggiunto al mio modello più semplice possibile.

 public string Foo { get { throw new Exception("bar"); } }
  

[TargetInvocationException: proprietà di accesso 'Foo' sull'oggetto 'Rolling_Razor_MVC.Models.ContactUsModel' ha generato la seguente eccezione: 'bar']      System.ComponentModel.ReflectPropertyDescriptor.GetValue (Component Object) +390      System.Web.Mvc. <> C__DisplayClassb. b__a () +18      System.Web.Mvc.ModelMetadata.get_Model () +22      System.Web.Mvc.ModelMetadata.get_RealModelType () +29      System.Web.Mvc. d__0.MoveNext () +38      System.Linq. d__14`2.MoveNext () 273      System.Web.Mvc. d__5.MoveNext () 644      System.Web.Mvc.DefaultModelBinder.OnModelUpdated (ControllerContext controllerContext, ModelBindingContext BindingContext) +92      System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext BindingContext, il modello Object) +60      System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext BindingContext) 1048      System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext BindingContext) 280      System.Web.Mvc.Controller.TryUpdateModel (modello tModel, prefisso String, String [] includeProperties, String [] excludeProperties, IValueProvider valueProvider) +449      System.Web.Mvc.Controller.TryUpdateModel (modello tModel) 73

È stato utile?

Soluzione

Credo che sto sperimentando un problema simile. Ho postato i dettagli:

http://forums.asp.net/t/1523362.aspx


modifica : Risposta da squadra MVC (dall'alto URL):

Abbiamo studiato questo e hanno concluso che il sistema di validazione si comporta come previsto. Dal momento che la validazione dei modelli comporta il tentativo di eseguire la convalida su tutte le proprietà, e dal momento che non annullabili proprietà del tipo di valore hanno un attributo implicita [Required], stiamo convalidando questa proprietà e chiamando il suo getter nel processo. Siamo consapevoli che si tratta di una modifica sostanziale da V1 del prodotto, ma è necessario per rendere il nuovo sistema di validazione del modello funziona correttamente.

Hai alcune opzioni per aggirare questo. Ogni uno di questi dovrebbe funzionare:

  • Modificare la proprietà data a un metodo al posto di un immobile; in questo modo verrà ignorato dal framework MVC.
  • Cambiare il tipo di proprietà DateTime? invece di DateTime. Ciò elimina la implicita [Required] da questa proprietà.
  • Cancella il DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes bandiera statica. Questo rimuove a livello di applicazione l'implicito [Required] da tutte le proprietà del tipo di valore non nullable. Stiamo prendendo in considerazione l'aggiunta di V3 del prodotto un attributo che segnalare a noi "non associarlo, non convalidarlo, solo finta che questa proprietà non esiste".

Grazie ancora per il report!

Altri suggerimenti

Hai ancora lo stesso problema con MVC3.

Penso che il modo migliore è quello di solo a questo in global.asax (dalla risposta di SevenCentral):

 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Questo disabiliterà per tutti loro

Questo sembra per tutto il mondo come un insetto per me. Sono pienamente non riesco a capire il motivo per cui il ModelBinder ha bisogno di controllare la mia lettura solo le proprietà (ci possono essere alcuni aspetti tecnici, ma io sicuramente non capisco, e non sono disposti a spendere il tempo a cercare di).

ho aggiunto il seguente Provider modello metadati per la mia soluzione per aggirare il problema

protected override CachedDataAnnotationsModelMetadata CreateMetadataPrototype(IEnumerable<Attribute> attributes, Type containerType, Type modelType, string propertyName)
{
    var metadata = base.CreateMetadataPrototype(attributes, containerType, modelType, propertyName);

    if (metadata.IsReadOnly)
    {
        metadata.IsRequired = false;
    }

    return metadata;
}

protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype(CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor)
{
    var metadata = base.CreateMetadataFromPrototype(prototype, modelAccessor);

    if (prototype.IsReadOnly)
    {
        metadata.IsRequired = false;
    }

    return metadata;
}

È inoltre necessario aggiungere quanto segue a Global.asax.cs

protected void Application_Start()
{
    ModelMetadataProviders.Current = new RESModelMetadataProvider();
    ModelBinders.Binders.Add(typeof(SmartDate), new SmartDateModelBinder());

    ...
}

Naturalmente Credo che avrei potuto convertire CityStateZip a GetCityStateZip() ma poi non posso legherò in qualcosa come Silverlight altrettanto facilmente. Questo potrebbe funzionare per una soluzione temporanea per chiunque altro si verifica questo problema.

Ho lo stesso problema esatto !!

Per ulteriori informazioni sul mio problema, è possibile visitare il sito ASP.NET MVC 2.0 inutilizzato proprietà modello essere chiamato quando la pubblicazione di un prodotto al server?

significa questo abbiamo bisogno di programmare le nostre proprietà con il presupposto che essi saranno chiamati inaspettatamente (prima di proprietà che dipende sono impostati / inizializzato etc) ... se è così, questo rappresenta un cambiamento nelle nostre pratiche di programmazione e vorrei sapere come procedere.

Nel frattempo, ho solo un semplice 'se' verificare che libera il problema.

ho avuto un problema simile, un campo che non mi aspettavo di essere validati stava ricevendo un errore quando il modulo pubblicato al controller. Dopo un po 'googling, mi sono imbattuto in http://codeblog.shawson.co.uk/mvc-strongly-typed-view-returns-a-null-model-on-post-back/ dove è stato sottolineato che conflitti di nome potrebbe causare problemi.

Anche se non pensavo che il mio post-back di classe variabile era in conflitto nomi di proprietà, rinominare la proprietà che riceve l'errore risolto il mio problema.

Lo stesso problema esiste ancora in MVC 5.2.3, e non è nemmeno il codice di convalida che causa il problema. Il DefaultModelBinder chiama i getter al di fuori del suo codice di validazione, anche se sono proprietà di sola lettura e, anche se non ci sono dati richiesta sta per essere passata al controller corrispondente quelle proprietà.

Vedere una spiegazione più dettagliata e la mia soluzione completa: https://stackoverflow.com/a/54431404/10987278.

Non sono sicuro se questa soluzione può essere riscritta per lavorare con MVC 3, ma si spera che possa aiutare gli altri ancora soffrono lo stesso problema nella versione successiva di MVC che siamo imbattuti in questo problema come ho fatto io.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top