ASP.Net 框架 MVC 实体 6 中的日期时间字段
DateTime Field in ASP.Net Framework MVC Entity 6
与 相似,但不完全相同。他们的解决方案也没有解决我的问题。我有一个带有种子数据的 dB 和以下内容,
具有可为 null 的 DateTime 属性的模型:
[DataType(DataType.Time)]
[DisplayFormat(DataFormatString = "{0:hh:mm tt}", ApplyFormatInEditMode = true)]
[Display(Name = "Evening Showtime")]
public DateTime? ShowtimeEve { get; set; }
名为 Productions.cshtml
的 Razor 页面视图:
@model TheatreCMS.Models.Production
@using TheatreCMS.Controllers
@{
ViewBag.Title = "Edit";
}
@Styles.Render("~/Content/Site.css")
<h2>Edit</h2>
@using (Html.BeginForm("Edit", "Productions", null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="formContainer2">
<div class="form-horizontal">
<h4>Production</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.ProductionId)
<div class="form-group">
@Html.LabelFor(model => model.ShowtimeEve, htmlAttributes: new { @class = "control-label col-md-2 inputLabel" })
<div class="col-md-10 formBox">
@Html.EditorFor(model => model.ShowtimeEve, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ShowtimeEve, "", new { @class = "text-danger" })
</div>
</div>
}
还有一个控制器 ProductionsController.cs
使用 DBContext 的继承将数据传递给视图(这是一个代码优先项目):
[HttpGet]
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Production production = db.Productions.Find(id);
if (production == null)
{
return HttpNotFound();
}
return View(production);
}
View 上的表单不会填充创建的输入字段中的数据。它正在创建一个空白的时间选择器字段。我需要它成为一个数据填充的时间选择器字段。这是一个编辑视图,因此目标是用数据填充所有字段,向客户显示他们将要更改的内容。
我运行 调试器,一步一步检查输出值。它正在将 DateTime 值从 Controller 传递到 View,但之后它在某处丢失了。
这是渲染后的样子:
我会给你一些建议,问题应该是其中之一。
Change datetime format like this DataFormatString = "{0:hh:mm}"
When I look your get action, I noticed to you are using entitiy but
your view page model is a model. You should convert entity data to
your model and return with your view page model. But your model and
entity is a same class, this shouldn't be the problem. For example your action;
[HttpGet]
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Production production = db.Productions.Find(id);
if (production == null)
{
return HttpNotFound();
}
else
{
var productionModel = new Production();//TheatreCMS.Models.Production
productionModel.ShowtimeEve = production.ShowtimeEve;
//other converts here
}
return View(productionModel);
}
My other advice, try use this code in view;
@Html.TextBoxFor(m => m.ShowtimeEve, new { @class = "form-control" })
我找到了答案。我把问题复杂化了。虽然每个人都提供了很好的答案和见解,但真正的问题是 HTML5 问题以及如何将值属性发送到视图。表单输入标签上的值属性的格式需要在 24 小时内。格式,而不是 12 小时。
因此只需更改:
[DisplayFormat(DataFormatString = "{0:hh:mm tt}", ApplyFormatInEditMode = true)]
到
[DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
发送到 Production 的编辑视图的输入元素的值现在在 24 小时内呈现。允许时间选择器正确 re-format 回到 12 小时的格式。查看。
它一直都在 inspector 中!
感谢大家的帮助。我是 C# 的新手,更不用说 ASP.NET 实体 MVC,因此非常感谢支持。
与
具有可为 null 的 DateTime 属性的模型:
[DataType(DataType.Time)]
[DisplayFormat(DataFormatString = "{0:hh:mm tt}", ApplyFormatInEditMode = true)]
[Display(Name = "Evening Showtime")]
public DateTime? ShowtimeEve { get; set; }
名为 Productions.cshtml
的 Razor 页面视图:
@model TheatreCMS.Models.Production
@using TheatreCMS.Controllers
@{
ViewBag.Title = "Edit";
}
@Styles.Render("~/Content/Site.css")
<h2>Edit</h2>
@using (Html.BeginForm("Edit", "Productions", null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="formContainer2">
<div class="form-horizontal">
<h4>Production</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.ProductionId)
<div class="form-group">
@Html.LabelFor(model => model.ShowtimeEve, htmlAttributes: new { @class = "control-label col-md-2 inputLabel" })
<div class="col-md-10 formBox">
@Html.EditorFor(model => model.ShowtimeEve, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ShowtimeEve, "", new { @class = "text-danger" })
</div>
</div>
}
还有一个控制器 ProductionsController.cs
使用 DBContext 的继承将数据传递给视图(这是一个代码优先项目):
[HttpGet]
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Production production = db.Productions.Find(id);
if (production == null)
{
return HttpNotFound();
}
return View(production);
}
View 上的表单不会填充创建的输入字段中的数据。它正在创建一个空白的时间选择器字段。我需要它成为一个数据填充的时间选择器字段。这是一个编辑视图,因此目标是用数据填充所有字段,向客户显示他们将要更改的内容。
我运行 调试器,一步一步检查输出值。它正在将 DateTime 值从 Controller 传递到 View,但之后它在某处丢失了。
这是渲染后的样子:
我会给你一些建议,问题应该是其中之一。
Change datetime format like this
DataFormatString = "{0:hh:mm}"
When I look your get action, I noticed to you are using entitiy but your view page model is a model. You should convert entity data to your model and return with your view page model. But your model and entity is a same class, this shouldn't be the problem. For example your action;
[HttpGet]
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Production production = db.Productions.Find(id);
if (production == null)
{
return HttpNotFound();
}
else
{
var productionModel = new Production();//TheatreCMS.Models.Production
productionModel.ShowtimeEve = production.ShowtimeEve;
//other converts here
}
return View(productionModel);
}
My other advice, try use this code in view;
@Html.TextBoxFor(m => m.ShowtimeEve, new { @class = "form-control" })
我找到了答案。我把问题复杂化了。虽然每个人都提供了很好的答案和见解,但真正的问题是 HTML5 问题以及如何将值属性发送到视图。表单输入标签上的值属性的格式需要在 24 小时内。格式,而不是 12 小时。
因此只需更改:
[DisplayFormat(DataFormatString = "{0:hh:mm tt}", ApplyFormatInEditMode = true)]
到
[DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
发送到 Production 的编辑视图的输入元素的值现在在 24 小时内呈现。允许时间选择器正确 re-format 回到 12 小时的格式。查看。
它一直都在 inspector 中!
感谢大家的帮助。我是 C# 的新手,更不用说 ASP.NET 实体 MVC,因此非常感谢支持。