【问题标题】:Telerik grid ClientTemplateTelerik 网格客户端模板
【发布时间】:2012-07-28 07:06:04
【问题描述】:

在我的 MVC 应用程序的 Telerik 网格中显示 DateTime 时,我尝试使用 C# 应用一些逻辑,但在使其正常工作时遇到了一些麻烦。我的第一个问题是我不完全了解 ClientTemplate 调用的工作原理。我也找不到解释它是如何工作的文档。所以,解释一下它是如何工作的会很有帮助,然后可能就是我的例子出了什么问题:

columns.Bound(p => p.SetupDate).ClientTemplate("<#= SetupDate == DateTime.Min || SetupDate == null ? string.empty : SetupDate #>")

更新:

我同意了丹尼尔的建议。我只是从 ClientTemplate() 调用这个函数。这是最终代码:

// Setup a minDate to mimic C#'s Date.MinDate constant.
var minDate = new Date();
minDate.setFullYear(1, 0, 1);
minDate.setHours(0, 0, 0, 0);

function checkDateWithFormat(d, f)
{
    if (d.getTime() == minDate.getTime())
    {
        return "";
    }
    else
    {
        return d.toString(f);
    }
}

【问题讨论】:

  • 我认为您不能在客户端模板中添加这样的逻辑。您需要将逻辑放入模型中。
  • 据我了解,如果我将该逻辑放入模型中(即,在某些情况下返回一个空字符串,在这种情况下,我将使用字符串类型而不是 DateTime在网格中输入),然后排序将无法正常工作。这确实是我要在这里解决的全部问题。欢迎提出任何建议。
  • 如果排序是真正的问题,我可能会在模型中创建另一个属性来排序,也许是一个 int,并使用 SetUpDate 来填充它。然后,您可以将日期格式化为所需显示的字符串,并且不会失去保持列表正确排序的能力

标签: c# asp.net-mvc telerik telerik-grid


【解决方案1】:

首先,您可能希望确保 SetupDate 能够自行工作。如果是这样,您可以尝试添加括号。

columns.Bound(p => p.SetupDate).ClientTemplate("<#= ((SetupDate == DateTime.Min) || (SetupDate == null)) ? string.Empty : SetupDate #>")

或者您可以尝试使用 if 语句。

columns.Bound(p => p.SetupDate).ClientTemplate("<# if ((SetupDate != DateTime.Min) && (SetupDate != null)) { #><#= SetupDate #><# } #>")

更新 NullReference 的答案是正确的,它说您不能在 ClientTemplate 中使用 c#。所以你不能使用 DateTime.Min 或 string.Empty。

实现相同目的的一种方法是使用 javascript 函数。像这样定义列:

columns.Bound(p => p.SetupDate).ClientTemplate("<#= checkDate(SetupDate) #>")

然后添加javascript函数checkDate()。 (可能有更好的方法来查找最小值,但如果是最小值,getMilliseconds 应该为 0。)

<script>
  function checkDate(setupDate) {
    if ((setupDate.getMilliseconds() === 0) || (setupDate === null))
      return '';
    else
      return setupDate;
  }
</script>

【讨论】:

  • string.empty 应该是 string.Empty(我无法编辑,因为它只有 1 个字符的编辑)
  • 虽然我没有使用你的确切代码,但我确实使用了你的想法。我将在问题中发布上面的最终代码。谢谢!
  • @birdus 这看起来是个不错的方法。我喜欢你在函数中放置日期格式的方式。
【解决方案2】:

客户端模板是在客户端用 javascript 执行的,所以你不能使用 C#。任何被“”包围的内容都对应于模型上的属性。我发现找到这些东西的最佳位置是查看 Telerik 的演示页面 here

【讨论】:

  • 那不是说任何被“”包围的东西都会在服务器上执行吗?否则,它不知道我的模型,对吧?
  • @birdus "" 并不意味着它在服务器上执行。这就是 asp.net 的方式,但这纯粹是客户端绑定。
【解决方案3】:

客户端模板是将在客户端执行的javascript代码,其结果将转换为字符串并在此位置使用。所以你不能在你的 ClientTemplate 中使用 string.Empty 并且应该使用 '' 来代替它。

columns.Bound(p => p.SetupDate)
       .ClientTemplate("<#= (SetupDate == DateTime.Min) || (SetupDate == null) ? '' : SetupDate #>")

【讨论】:

    【解决方案4】:

    我会在模型上定义另外几个属性以使 ClientTemplate 更简洁:

    public bool HasSetupDate {
      get {
        return this.SetupDate != DateTime.Min && this.SetupDate != null;
      }
    }
    
    public string SetupDate_Str {
      get{
        return this.SetupDate.ToString("MM/dd/yyyy");
      }
    }
    

    然后 ClientTemplate 看起来像这样: .ClientTemplate("")

    【讨论】:

    • 我也想过这样做,但是如果您返回一个字符串(而不是 DateTime),则网格将无法在该列上正确排序。
    • 我认为您对排序问题有误。 ClientTemplate 仅用于显示数据。在列定义上,您将其绑定到某个属性(这里是 .BindTo(m => m.SetupDate) ),并且此属性用于对表进行排序。此外,排序发生在服务器端(发出 Ajax 请求,并用新数据刷新表)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多