【发布时间】:2018-04-17 13:16:41
【问题描述】:
我决定在这里创建一个新帖子,而不是另一个有点混乱的帖子。 (Input box as "date" on web when model is "int")
在这篇文章中,我添加了我使用的代码。
问题在于,在 SQL 服务器中,字段 FrDr 的类型为 int,我需要网页上的用户输入“日期”类型的输入字段
如果我将 [DataType(DataType.Date)] 添加到模型中,我会自动获取输入日期类型。但如果我将其添加到页面模型中则不会
如何更改我的代码,以便用户获得日期类型的输入字段,将日期值作为 int 保存到 SQL。
模型 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; }
}
}
页面模型
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");
}
}
}
剃刀页面
@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>
更新
如果我将以下内容添加到页面模型中
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
【问题讨论】:
-
[DataType(DataType.Date)]只需将type="date"添加到您的输入中。您不能将日期绑定到int。使用包含DateTime属性的视图模型(并在GET 方法中将int映射到DateTime,在POST 方法中反之亦然。 -
它不起作用,如果我将输入字段更改为“日期”,我会在发布时得到零回报
-
再次(这只是重复您在上一个问题中得到的所有 cmets)-模型的 property 必须是
DateTime- 即您创建一个视图型号为public DateTime FrDt { get; set; } -
查看我更新的帖子(底部)
-
在您的 Agr 课程中,您需要
[DataType(DataType.Date)] [Display(Name = "From Date")] public DateTime FrDt { get; set; }。然后当您保存到数据库时,将其转换为您的整数表示(我假设 int 表示自 1970 年以来的毫秒数或类似的东西?)。当您从数据库中检索时,再次将其转换回 DateTime。不确定将 DateTime 属性添加到主 PageModel 会实现什么,因为您的表单上似乎没有该属性
标签: asp.net-mvc datetime model type-conversion razor-pages