【问题标题】:Can't see the date value from a <td> element in Date1看不到 Date1 中 <td> 元素的日期值
【发布时间】:2018-10-22 18:26:35
【问题描述】:

我正在尝试比较从数据库中提取的两个日期。我在 ASP .NET mvc 中做这一切。

这是我的模型类:

public DateTime? Date1{ get; set; }
public DateTime? Date2 { get; set; }

控制器:

public ActionResult 
   {
      Hello test = new Hello();
      return View(test.getStuff());
    }

观看次数:

 @foreach (var item in Model)
   {
    <td id="date1"> @Html.EditorFor(x => item.Date1)</td>
    <td id="date2">@Html.DisplayFor(x => item.Date2)</td>
   }

   <script type="text/javascript">

    $(document).ready(function () {
        $("td#date1").bind("change", function () {
            var cur_td = $(this).parent("tr#home");
            var date2 = cur_td.find("td#date2").text();
            console.log(date2);
            var date1 = cur_td.find("td#date1").text(); // I don't understand why this is null? 
            console.log(date1);

            if (date1 > date2) {
                alert("Outside of the Editor Box");
            } else {
                alert("Date ok");
            }
     });
});

HTML:

<input class="text-box single-line" data-val="true" data-val-date="The field date1 must be a date." id="item_date1" name="item.Date1" type="date" value="2017-03-31">

<input class="text-box single-line" data-val="true" data-val-date="The field date1 must be a date." id="item_date1" name="item.Date1" type="date" value="2017-04-20">

这是谷歌浏览器控制台吐出的内容: 控制台:

Date2 已显示,但 Date1 保持空白,因此 if 语句总是跳过第一个条件并直接进入 else 条件。我只想比较这两个日期,但我似乎无法获得 Date1 的日期值。有什么解决方法吗?

【问题讨论】:

  • 请出示您的 html。
  • @AdrianoRepetti 我意识到,只有 date1 需要编辑。 .Editorfor 函数是否会导致这些问题?
  • 你有一个 @foreach 循环,在它里面,你渲染你的 td 标签。您在 foreach 中使用 ID 的 date1 和 date2,这意味着对于每个循环,您将获得多个具有相同 ID 的 td 标签,这是一个坏主意,您将无法分辨出您真正想要的 td。
  • @PoulBak 上传了 HTML。
  • @AlfredoA。我看到了问题,对此有什么解决方法?我通过从数据库中查询来获取所有这些日期。我怎样才能把它从循环中拉出来,仍然有我需要的日期?

标签: javascript jquery html asp.net-mvc


【解决方案1】:

您的代码存在一些问题。首先,您在 foreach 循环中硬编码了 Id 属性值,这将为多个元素创建相同的 Id 值。

由于您在循环中渲染多个项目,因此您应该考虑使用 closestfind 等相关方法。我还将 tds 包装在一个父元素中,您可以在使用相关方法时使用它来限制范围。

我删除了Id 属性,并为每个 tds 提供了一个简单的 date1 和 date2 属性

<table>
    @foreach (var item in Model)
    {
        <tr>
            <td date1> @Html.EditorFor(x => item.Date1)</td>
            <td date2>@Html.DisplayFor(x => item.Date2)</td>
        </tr>
    }
</table>

现在在您的脚本中,您可以使用此属性来监听 input 元素中的更改事件,使用 2 个日期值,从这些字符串创建 Date 对象并进行检查。

$(document).ready(function () {
    $("td[date1] > input").bind("change", function () {

        var $tr = $(this).closest("tr");
        var date1 = $(this).val();
        var date2 = $tr.find("td[date2]").text();

        // Make sure to check date1 and date2 for empty string before trying to parse

        var d1 = Date.parse(date1);
        var d2 = Date.parse(date2);

        if (d1 > d2) {
            console.log("Outside of the Editor Box");
        } else {
            console.log("Date ok");
        }
    });
});

【讨论】:

  • 这就像一个魅力!但是有一个问题,如果我希望文本框在返回“框外”后返回其原始日期,那怎么可能?
  • $(this).val("any value you want")
  • 我试过了,$(this).val(date1),但它给了我我选择的日期,而不是我最初在编辑器框中的原始日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2021-08-07
相关资源
最近更新 更多