1

我有一个带有 TimeSpan (TimeWorked) 的模型,我想将一个文本框绑定到 TimeSpan 的小时和分钟字段。

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

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

我如何实现这一目标?

4

3 回答 3

3

我希望这有帮助:

模型类

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

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

自定义模型绑定器

 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)
    {
    }
于 2013-09-29T04:30:17.600 回答
0

TimeSpan?我根据之前找到的版本实现了一个自定义模型绑定器。在这里直接粘贴有点长,但我已经提出了要点

于 2013-10-14T17:00:20.173 回答
0

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

于 2013-09-27T22:51:07.833 回答