Quali sono alcune cose utili che puoi fare con i ModelBinders Mvc?

1

Mi viene in mente che il meccanismo ModelBinder in ASP MVC

public interface IModelBinder {
  object BindModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext);
}

È follemente potente. Quali sono alcuni usi interessanti di questo meccanismo che hai fatto / visto?

Credo che dal momento che il concetto è simile in altri framework non c'è motivo di limitarlo ad Asp Mvc

    
posta George Mauer 12.04.2012 - 21:57
fonte

2 risposte

2

Considera un tipo personalizzato denominato TimeInterval archiviato come double , ma viene visualizzato come hh.mm.ss.ffffff dove ffffff è secondi frazionari. Con l'associazione personalizzata, è possibile mostrare al raccoglitore come analizzare e visualizzare correttamente questi numeri, senza dover scrivere codice personalizzato nel controller.

// This class implements a custom data type for data binding.
public class TimeInterval
{
    double _value;

    // Constructor
    public TimeInterval(string value)
    {
        // Extension method parses hh.mm.ss.ffffff string value to double.
        _value = value.ToSeconds();
    }
    // Constructor
    public TimeInterval(double value)
    {
        _value = value;
    }
    public string GetText()
    {
        // Extension method formats double value as hh.mm.ss.ffffff time string.
        return _value.ToTimeString();
    }
    public double? GetValue()
    {
        return _value;
    }
}

// This class implements custom binding for the TimeInterval custom type.  
// It is registered in Global.asax 
public class TimeIntervalBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string value = GetAttemptedValue(bindingContext);

        if (value == "")
            return null;

        return new TimeInterval(value);
    }

    private static string GetAttemptedValue(ModelBindingContext context)
    {
        ValueProviderResult value = context.ValueProvider[context.ModelName];
        return value.AttemptedValue ?? string.Empty;
    }
}

// in Global.asax:
protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.Add(typeof(TimeInterval), new TimeIntervalBinder());
}

Ora l'associazione avviene automaticamente per il nuovo tipo personalizzato.

    
risposta data 12.04.2012 - 22:03
fonte
0

Ho utilizzato i binder del modello per localizzare il contenuto in base alle informazioni sullo stato della sessione. Quando il controller conosce qualcosa, il contenuto è già stato impostato in base alle impostazioni locali preferite dell'utente.

    
risposta data 12.04.2012 - 22:08
fonte

Leggi altre domande sui tag