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.