型号为“int”时,在Web上输入框作为“日期”(再次)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了型号为“int”时,在Web上输入框作为“日期”(再次)相关的知识,希望对你有一定的参考价值。
我决定在这里创建一个新帖子,而不是另一个有点令人困惑的帖子。 (Input box as "date" on web when model is "int")
在这篇文章中,我添加了我使用的代码。
问题是在SQL服务器中,字段FrDr的类型为int,我需要网页上的用户输入“date”类型的输入字段
如果我将[DataType(DataType.Date)]添加到模型中,我会自动获得输入日期类型。但如果我将它添加到Page Model中则不行
如何更改我的代码,以便用户获得类型为date的输入字段,将日期值保存为int到SQL。
MODEL AGR.CS
namespace DateTest.VismaModels {
public partial class Agr {
[Key]
[Display(Name = "Actor")]
public int AgrActNo { get; set; }
public int AgrNo { get; set; }
[DataType(DataType.Date)]
[Display(Name = "From Date")]
public int FrDt { get; set; }
}
}
PAGE MODEL
namespace DateTest.Pages {
public class IndexModel : PageModel {
private readonly DateTest.VismaModels.F0001Context _context;
public IndexModel(DateTest.VismaModels.F0001Context context) {
_context = context;
}
public bool ShowMessage => !string.IsNullOrEmpty(Message);
[TempData]
public string Message { get; set; }
[BindProperty]
public Agr AgrRow { get; set; }
public async Task<IActionResult> OnGetAsync(int? id) {
if (id == null) {
Console.WriteLine("New");
AgrRow = new Agr();
AgrRow.AgrNo = _context.Agr.Select(q => q.AgrNo).DefaultIfEmpty(0).Max() + 1;
//AgrRow.FrDt = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}
if (!ModelState.IsValid) {
//var errors = ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).ToList();
var errors = string.Join(" | ", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage));
Message += "Model not valid : " + errors;
return Redirect("~/Activities/index");
}
return Page();
}
public async Task<IActionResult> OnPostSaveNewRowAsync() {
if (!ModelState.IsValid) {
//var errors = ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).ToList();
var errors = string.Join(" | ", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage));
Message += "Model not valid : " + errors;
return Redirect("~/index");
}
_context.Add(AgrRow);
try {
await _context.SaveChangesAsync();
} catch (DbUpdateConcurrencyException) {
throw;
}
Message += "Saved";
return RedirectToPage("/index");
}
}
}
RAZOR PAGE
@page
@model DateTest.Pages.IndexModel
@{
ViewData["Title"] = "Activities";
}
<h2>Activities</h2>
@if (Model.ShowMessage) {<div class="alert alert-info alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"></button>
@Model.Message
</div>
}
<p>
<a asp-page="Create">Create New</a>
</p>
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="AgrRow.AgrNo" />
<table class="table">
<tbody>
<tr>
<td><input asp-for="@Model.AgrRow.AgrActNo" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.FrDt" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.ToDt" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.FrTm" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.ToTm" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.CustNo" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.ProdNo" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.Descr" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.NoInvoAb" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.Price" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.Am" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.Fin" class="form-control" /></td>
<td><input asp-for="@Model.AgrRow.Invo" class="form-control" /></td>
<td>
<div class="form-group">
<button type="submit" value="Save New" asp-page-handler="saveNewRow" asp-route-id="@Model.AgrRow.AgrNo" class="btn btn-default">
<i class="fa fa-save"></i>Create
</button>
</div>
</td>
</tr>
</tbody>
</table>
</form>
UPDATE
如果我将以下内容添加到页面模型中
public DateTime FrDt { get; set; }
并在这样的post方法中打印出结果
Console.WriteLine("FRDT = " + FrDt);
Console.WriteLine("AGRROW FRDT = " + AgrRow.FrDt);
我明白了
FRDT = 0001-01-01 00:00:00
AGRROW FRDT = 0
答案
我想到了。
在我的Agr模型中,我添加一个临时字段FrDt2,它是DateTime并使用[NotMapped]注释,因此它不会将它发送到sql
[NotMapped]
public DateTime FrDt2 { get; set; }
在我的Page模型中,我将FrDt2转换为int,然后将其添加到FrDt。
AgrRow.FrDt = int.Parse(AgrRow.FrDt2.ToString("yyyyMMdd"));
并且,为了在输入日期框中显示SQL中的现有项目,我将其转换回int,就像这样
AgrRow.FrDt2 = DateTime.ParseExact(AgrRow.FrDt.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);
以上是关于型号为“int”时,在Web上输入框作为“日期”(再次)的主要内容,如果未能解决你的问题,请参考以下文章