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

时间:2016-10-15 09:57:44

标签: asp.net asp.net-mvc html-helper html.hiddenfor

不确定如何更好地表达问题。我想使用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是否正确?哪一个将用于将数据发送回数据库?只显示预定义的日期时间信息并将其发送到数据库的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

表单只提交其表单控件的名称/值对(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)

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