使用HiddenFor和DisplayFor在View中正确显示数据并保存

Correctly display data in View and save it using HiddenFor and DisplayFor

我想使用 hiddenFor 字段将 record_time 保存到数据库,同时在 html.display 或类似字段中显示日期而不编辑。

创建操作

public ActionResult Create()
    {            
        Record newRecord = new Record();
        newRecord.user_id = 1; //let it be 1 for simplicity
        newRecord.record_time = System.DateTime.Now;
        return View(newRecord);
    }

创建视图

    <div class="form-group">
        @Html.LabelFor(model => model.user_id, "User name", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.HiddenFor(model => model.user_id)
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.record_time, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.HiddenFor(model => model.record_time)
            
            //this line I'm concerned about
            @Html.DisplayFor(model => model.record_time, new { htmlAttributes = new { @class = "form-control" } })             
        </div>
    </div>
  1. 大约user_id。对新记录使用 hiddenFor 而不是 editorFor 是否正确?

  2. 关于record_time。同时使用 hiddenFor 和 displayFor 是否正确?哪一个将用于将数据发送回数据库?仅显示预定义的日期时间信息并将其发送到数据库的正确方法是什么?

一个表单只提交name/value对它的表单控件(input,select,textarea)并且DisplayFor()不生成表单控件。

如果你想使用DisplayFor()格式化日期,那么你可以使用DisplayFormatAttribute,例如

[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime record_time { get; set; }

或者您可以只使用 <div>@Model.record_time.ToString("MM/dd/yyyy")</div>

请注意 DisplayFor() 只呈现文本,而不是元素,并且它没有接受 htmlAttributes 的重载(没有要应用属性的元素,所以它只是

@Html.DisplayFor(m => m.record_time)

附带说明一下,您这两个属性的名称表明它们是针对 created/edited 记录的用户和创建记录的日期。如果是这种情况,您的视图不应包含这些值的任何输入。两者都应在保存数据模型之前立即在 POST 方法中设置。如果它是创建视图,则显示 record_time(假设它是记录的创建日期)也没有任何意义(尚未创建)。