2011-09-20 9 views
11

èASP.Net MVC proprietà stringa 3 bind come string.Empty invece di null modello

public partial class BilingualString 
{ 
    public string RuString { get; set; } 
    public string EnString { get; set; } 
} 

public partial class Member 
{ 
    public Member() 
    { 
     this.DisplayName = new BilingualString(); 
    } 
    public BilingualString DisplayName { get; set; } 
} 

se l'utente non riempire input i valori di RuString e EnString è nullo. Ho bisogno di string.Empty anziché null.

Utilizzando CustomModelBinder come questo:

public class EmptyStringModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelMetadata.ConvertEmptyStringToNull = false; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

non aiutano.

risposta

15

Utilizzare questa:

[DisplayFormat(ConvertEmptyStringToNull=false)] 
    public string RuString { get; set; } 

O

private string _RuString; 
    public string RuString { 
     get { 
      return this._RuString ?? ""; 
     } 
     set { 
      this._RuString = value ?? ""; 
     } 
    } 
+1

E se non si desidera contrassegnare ogni campo stringa come '[DisplayFormat (ConvertEmptyStringToNull = false)]'? – AlexBBB

+1

puoi usare il secondo modo !!! –

+0

La domanda è come dire a MVC 3 di associare l'input HTML vuoto come string.Empty, non come null (come in MVC 1). BilingualString è un esempio per mostrare che CustomStringModelBinder non esegue il trucco. – AlexBBB

2

vecchia questione, ma qui è una risposta in ogni caso :)

Il problema sembra essere che il ConvertEmptyStringToNull è impostato sul modello vincolante contesto, non il contesto di legame alla proprietà.

All'interno di DefaultModelBinder, chiama BindProperty per ogni proprietà del modello e non ricorre oggetti semplici come stringhe/decimali alla propria chiamata di BindModel.

Per fortuna possiamo sostituire il GetPropertyValue e impostare l'opzione sul contesto.

public class EmptyStringModelBinder : DefaultModelBinder 
{ 
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) 
    { 
     bindingContext.ModelMetadata.ConvertEmptyStringToNull = false; 
     return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder); 
    } 
} 

ha funzionato per me :)

[modifica] Come sottolineato nei commenti .. Questo modello legante funziona solo se registrati, quindi dopo l'aggiunta di classe, assicurarsi di chiamare

ModelBinders.Binders.Add(typeof(string), new EmptyStringModelBinder()); 

nel metodo Application_Start() di Global.asax.cs

+1

Per fare questo lavoro è necessario aggiungere anche 'ModelBinders.Binders.Add (typeof (stringa), new EmptyStringModelBinder());' in 'Application_Start()'. Dopo aver aggiunto questa linea, ha funzionato anche per me. – Manfred

+0

Scusa, mia cattiva risposta, ho risposto alla domanda dell'OP sul presupposto che sapessero fare questo dato che avevano già provato un raccoglitore personalizzato. non pensavo a nessun altro! – Mike

Problemi correlati