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,因此非常感谢支持。