2010-11-02 62 views
6

我想聲明我的視圖模型類型TimeSpan的一些屬性以顯示TotalMinutes屬性並綁定回TimeSpan整數模型綁定TimeSpan

我綁定的屬性,而無需使用強類型的輔助,以獲取TotalMinutes屬性:

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

當字段綁定回視圖模型類,它解析數爲一天(1440分鐘)。

如何在某些屬性上覆蓋此行爲(最好使用視圖模型本身的屬性)?

回答

10

編寫自定義的模型綁定似乎是一個好主意在這裏:

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

而且在Application_Start註冊吧:

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

最後總是喜歡在你看來強類型的輔助:

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

和相應的編輯模板(~/Views/Home/EditorTemplates/TimeSpan.ascx):

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

現在你的控制器可以是簡單的:

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

完美的作品。它沒有點擊它可以通過使用像這樣的值提供程序綁定到'TimeSpan'的屬性。謝謝。 – 2010-11-02 16:21:23