【问题标题】:Serializing ISO8601 string to C# TimeSpan将 ISO8601 字符串序列化为 C# TimeSpan
【发布时间】:2019-05-15 13:54:12
【问题描述】:

我的项目是一个 ASP.Net MVC 项目。在 JavaScript 中,我有一个 ISO 8601 字符串,例如 "PT15M"。如何定义我的模型以使其正确序列化为 TimeSpan 对象?

这是我的 Javascript:

var model = new TemplateMapModel();
model.DelayBy = "PT15M";
if (PerformClientSideValidation(model)) {
    $.ajax({
        type: 'POST',
        url: '/api/TemplateMap',
        data: { templateMap: model, files: files },
        success: function (result) {
            $('#modalTemplateMap').modal('toggle');
        },
        error: function (xhr, textStatus, e) { 
            var error = xhr.responseJSON.Message;
            ShowMessageBox("Error", error);
            ToggleBusyIndicator(false);
        },
        complete: function (xhr, textStatus) {
            TEMPLATEMAPPING.grid.reload();
        }
    });
}

我在我的模型中试过这个:

public TimeSpan DelayBy { get; set; }

这样做会产生一个空值。我也试过这个:

public string DelayBy { get; set; }

这会起作用,然后我可以使用XmlConvert.ToTimeSpan() 来获得我想要的东西,但是,我不希望这样做,因为它似乎不是正确的方法,必须将我的 DelayBy 声明为字符串,然后在我的业务逻辑中转换它。我想使用这个定义:

public TimeSpan DelayBy { get; set; }

并让 MVC 自动将其转换为 TimeSpan 对象。有什么想法吗?

【问题讨论】:

  • 重写setter 不适合你吗?
  • @AntihypeBird - 我可以这样做,但是我必须使用string 而不是TimeSpan。我试图坚持只使用TimeSpan
  • 你能展示/解释你是如何设置这个值的吗?
  • @AntihypeBird - 我添加了我的 Javascript 代码。

标签: javascript c# asp.net-mvc model


【解决方案1】:

尝试定义setter/getter

private TimeSpan _delayBy; 
public TimeSpan DelayBy { 
   get { 
      return this._delayBy;
   }
   set {
      this._delayBy = XmlConvert.ToTimeSpan(value.ToString());
   }
}

【讨论】:

  • 这行不通。如果我将DelayBy 声明为TimeSpan,则setter 将永远不会受到影响,因为MVC 转换器引擎没有看到TimeSpan 对象。它看到了一个string 对象。该解决方案将是 JavaScript 解决方案或某种自定义转换器对象。
  • @Icemanind 刚刚写了代码,看到了你的意思。所以基本上你需要将value 转换为字符串。立即尝试更新的代码
  • 哦等等,为了让它工作,你需要传递TimeSpan对象。没关系,我很笨
  • 还有其他想法吗?不知何故,我需要 MVC 转换器说“好的,这是一个 TimeSpan 对象。我会将它映射到这个 TimeSpan 属性”。
猜你喜欢
  • 2012-09-10
  • 2015-11-13
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多