2010-11-02 32 views
6

özelliğini görüntülemek için TimeSpan türünde Görünüm Modelimin bazı özelliklerini bildirmek ve bir TimeSpan numarasına geri bağlamak istiyorum. bir gün kadar sayı ayrıştırırModel ciltleme TimeSpan tam sayı

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

alan geri Görünüm Modeli sınıfına bağlıdır:

Ben TotalMinutes özelliği almak üzere kesinlikle yazılan yardımcı kullanmadan özelliği bağlı ettik (1440 dak).

Bu davranışı belirli özellikler üzerinde nasıl geçersiz kılabilirim (tercihen Görünüm Modeli'nde öznitelikleri kullanarak)?

cevap

10

bir özel modeli cilt yazma burada iyi bir fikir gibi görünüyor:

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); 
    } 
} 

Ve Application_Start ortamında kayıt:

: nihayet hep

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

Ve görünümünde türü kesin yardımcıları tercih

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

Ve ilgili düzenleyici şablonu (~/Views/Home/EditorTemplates/TimeSpan.ascx):

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

Şimdi kontrolör kadar basit olabilir: mükemmel

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

eserler. Bunun gibi değer sağlayıcısını kullanarak 'TimeSpan'ın bir özelliğine bağlamanın mümkün olacağını tıklamadı. Teşekkürler. –