MVC EditorFor TimeSpan.Hours没有约束力

时间:2013-09-27 22:33:11

标签: c# asp.net-mvc model-binding timespan

我有TimeSpan(TimeWorked)的模型,我想将文本框绑定到TimeSpan的Hours和Minutes字段。

@Html.EditorFor(model => model.TimeWorked.Hours)
...
@Html.EditorFor(model => model.TimeWorked.Minutes)

但是在控制器post方法中,值不是发布模型的一部分,因为TimeSpan.HoursTimeSpan.Minutes没有setter方法。

我如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

我希望这会有所帮助:

模型类

 public class TestModel
  {
    public string name { get; set; }
    public TimeSpan TimeWorked { get; set; }

    public TestModel()
    {
        TimeWorked = new TimeSpan(3, 20, 0);
        name = "hello";
    }
}

自定义ModelBinder

 public class TimeModelBinder:DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = (TestModel)base.BindModel(controllerContext, bindingContext);
        var Hour = controllerContext.HttpContext.Request["TimeWorked.Hours"];
        var minutes = controllerContext.HttpContext.Request["TimeWorked.Minutes"];
        var time = new TimeSpan(int.Parse(Hour), int.Parse(minutes), 0);

        model.TimeWorked = time;
        return model;
    }
}

控制器

    public ActionResult Index([ModelBinder(typeof(TimeModelBinder))]TestModel _model)
    {
    }

答案 1 :(得分:0)

我猜问题是TimeSpan没有无参数控制器,默认模型绑定器无法创建它的新实例,您可能需要为TimeSpan定义模型绑定器,如https://gist.github.com/chaoaretasty/1671586

答案 2 :(得分:0)

我根据之前找到的版本为TimeSpan?实现了自定义模型绑定器。直接粘贴在这里有点长,但我把它作为Gist