gpt4 book ai didi

c# - 尽管具有相同代码的字段工作正常(在 C# MVC、ASP.Net Core 中),但 DateTime 验证不起作用

转载 作者:可可西里 更新时间:2023-11-01 08:49:59 26 4
gpt4 key购买 nike

编辑 1

只是澄清几点,

  • 日期时间选择器/脚本似乎工作正常,时间和日期是可选的,并按预期使用正确的值填充文本框。
  • 当用户在文本框中手动输入时间/日期并输入无效时间(即“78/5/2017 12:00”或“12/5/2017 12:62”)时会出现此问题
  • 我已经更新了代码中的拼写错误,错误仍然出现在更正后的代码中。

我祈祷我错过了一些明显的东西,因为这对我来说毫无意义。您能提供的任何帮助将不胜感激。我在问题的末尾包含了我的代码。

问题

  • 我有两个 DateTime 字段,它们包含在我的应用程序页面的表单中:StartTimeEndTime
  • 这两个字段都使用(我认为是)相同的代码设置并放到页面上。
  • StartTime 字段工作得很好,只是输入的有效时间除外,并在用户更正之前显示无意义时间(例如 28:30 或 17:67)的错误。
  • EndTime 字段没有正确验证。错误的输入在传回 Controller 之前会切换回当前的时间/日期, Controller 甚至看不到错误的值,这意味着我无法捕捉到它并在此时返回错误。
  • 如果在两个字段中都给出了无意义的值,则提交将被阻止,并且两个字段都会显示验证错误,这表明 EndTime 验证确实有效,它只是不会阻止表单提交。<

我的努力

因为我有一个工作领域,所以我试图用它来纠正错误。然而,我在意识到两者之间没有区别时遇到了绊脚石。确定我一定错过了一些东西,我改变了变量名,以便 StartTime 将使用 EndTime 代码,反之亦然,我在下面的每个部分中都这样做了一个接一个地希望找到一个正在工作的领域交换的点。然而,那从未发生过。即使他们的全部代码都已切换,仍然发现 EndTime 变量/字段已损坏,而 StartTime 变量/字段仍在工作。

我的研究

尽管我花了将近一个星期的时间来处理这个错误,但现在我无法在网上找到任何类似的问题,并且完全不知道该去哪里或现在尝试什么。我曾尝试寻找由 DateTime 日历选择器引起的问题以及一般的验证错误,但找不到任何对这种情况有用的东西。

这是项目完成前要修复的最后一个错误之一,因此您能提供的任何帮助甚至想法都将是非常棒的。

代码

我已经将我能想到的与相关字段交互的所有内容都包含在此处。如果我遗漏了什么或者您需要更多信息,请告诉我。

实体模型

我的 Record 实体中有以下两个 DateTime 字段

public partial class Record
{
// Other entity fields
// ....
// ...
// ..

[DisplayName("Start Time")]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:g}", ApplyFormatInEditMode = true)]
public DateTime StartTime { get; set; }

[DisplayName("End Time")]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:g}", ApplyFormatInEditMode = true)]
public DateTime EndTime { get; set; }

// and in the constructor
public Record()
{
// initialise the DateTime fields with the current DateTime,
// adjusted for daylight savings

BaseController b = new BaseController();
StartTime = b.TimeNow();
EndTime = b.TimeNow();
}
}

为了完成,这是 TimeNow() 函数的代码:

public DateTime TimeNow()
{
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime t = DateTime.Now;

if (tz.IsDaylightSavingTime(t))
t = t.AddHours(1);

return t;
}

View 模型

Record 实体随后被包含到 ViewModel 中,如下所示:

public class Home_UserAddRecord
{
[DisplayName("Record")]
public Record record { get; set; }

// Other ViewModel fields
// ....
// ...
// ..

// and the blank constructor:
public Home_UserAddRecord()
{
record = new Record();
Error = false;
ErrorMessage = string.Empty;
}
}

CSHTML 表单

然后将它们包含在页面上的表单中,如下所示:

@using (Html.BeginForm())
{
<div class="form-horizontal">

<div class="form-group col-md-12">
@Html.LabelFor(model => model.record.StartTime, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
@Html.EditorFor(model => model.record.StartTime, new { htmlAttributes = new { @Value = Model.record.StartTime.ToString("dd/MM/yyyy HH:mm"), @class = "form-control", @id = "StartDate" } })
@Html.ValidationMessageFor(model => model.record.StartTime, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group col-md-12">
@Html.LabelFor(model => model.record.EndTime, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
@Html.EditorFor(model => model.record.EndTime, new{ htmlAttributes = new{ @Value = Model.record.EndTime.ToString("dd/MM/yyyy HH:mm"), @class = "form-control", @id = "EndDate" } })
@Html.ValidationMessageFor(model => model.record.EndTime, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>

</div>
}

附加脚本

最后,他们应用了一个脚本,以允许在每个输入上使用日历选择器。脚本如下所示:

@section Scripts{

<script>

var Start = new dhtmlXCalendarObject("StartDate");
Start.setDateFormat("%d/%m/%Y %H:%i");
Start.showToday();
Start.attachEvent("onTimeChange", function (d) {
var DateText = Start.getDate(true)
document.getElementById("StartDate").value = DateText;
});


var End = new dhtmlXCalendarObject("EndDate");
End.setDateFormat("%d/%m/%Y %H:%i");
End.showToday();
End.attachEvent("onTimeChange", function (d) {
var DateText = End.getDate(true)
document.getElementById("EndDate").value = DateText;
});

</script>
}

最佳答案

也许建议使用 DateTime.TryParseExact 方法,该方法将使用您所需的格式验证日期的“字符串”表示形式,并在字符串不符合您指定的格式时返回错误。这是代码,注意日期格式基于澳大利亚标准日期。您当然也可以为此添加小时和分钟。

注意 parsedDate 是一种 DateTime 格式。下面的用法是:

public void test(){
DateTime ParsedDate;
string SomeDate = "12-May-2017";
if(parseDate(SomeDate, out ParsedDate))
{
// Date was parsed successfully, you can now used ParsedDate, e.g.
Customer.Orders[0].DateRequired = ParsedDate;
}
else
{
// Throw an error
}
}

还有方法声明。在静态类中使用,或直接在您的类中使用。

public static bool parseDate(string theDate, out DateTime parsedDate)
{
string[] dateFormats = { "d-M-yy", "d-MMM-yy", "d-MMM-yyyy", "d-M-yyyy", "d/M/yy", "d/M/yyyy", "yyyy-mm-dd" };
bool result = DateTime.TryParseExact(
theDate,
dateFormats,
new CultureInfo("en-AU"),
DateTimeStyles.None, out parsedDate);

return result;
} //Convert string-based date to DateTime. Uses a variety of parse templates

关于c# - 尽管具有相同代码的字段工作正常(在 C# MVC、ASP.Net Core 中),但 DateTime 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44000296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com