2010-11-02 6 views
6

Je voudrais déclarer certaines propriétés de mon modèle de vue de type TimeSpan pour afficher la propriété TotalMinutes et renvoyer à TimeSpan.Modèle de liaison TimeSpan de nombre entier

J'ai lié la propriété sans utiliser l'aide fortement typée afin de récupérer la propriété TotalMinutes:

<%=Html.TextBox("Interval", Model.Interval.TotalMinutes)%> 

Lorsque le champ est lié revenir à la vue modèle classe, il analyse le numéro comme jour (1440 minutes).

Comment puis-je remplacer ce comportement sur certaines propriétés (de préférence en utilisant des attributs sur le modèle de vue lui-même)?

Répondre

10

Rédaction d'un liant modèle personnalisé semble être une bonne idée ici:

public class TimeSpanModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".TotalMinutes"); 
     int totalMinutes; 
     if (value != null && int.TryParse(value.AttemptedValue, out totalMinutes)) 
     { 
      return TimeSpan.FromMinutes(totalMinutes); 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

et l'enregistrement dans Application_Start:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    ModelBinders.Binders.Add(typeof(TimeSpan), new TimeSpanModelBinder()); 
} 

Et enfin toujours préférer des aides fortement typées dans votre vue:

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorFor(x => x.Interval) %> 
    <input type="submit" value="OK" /> 
<% } %> 

Et le modèle d'éditeur correspondant (~/Views/Home/EditorTemplates/TimeSpan.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TimeSpan>" %> 
<%= Html.EditorFor(x => x.TotalMinutes) %> 

Maintenant, votre contrôleur pourrait être aussi simple que:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Interval = TimeSpan.FromDays(1) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // The model will be properly bound here 
     return View(model); 
    } 
} 
+0

fonctionne parfaitement. Il n'a pas cliqué qu'il serait possible de lier à une propriété de 'TimeSpan' en utilisant le fournisseur de valeur comme ça. Merci. –