我有一个MVC Razor 创建视图,我的模型包含一个或多个需要由系统自动填充的字段,例如" Timestamp"和"用户名"。因为这些字段是必需的,所以它们必须采用这种形式。
以下是允许Visual Studio从控制器构建视图时默认代码的示例。
<div class="form-group">
@Html.LabelFor(model => model.RoseUserName,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.RoseUserName,
new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.RoseUserName, "",
new { @class = "text-danger" })
</div>
</div>
这是渲染时代码的样子。它功能齐全,但第一和第三个字段在它不应该是完全可编辑的时候。所以问题是我们如何在提交表单时让EditorFor字段将正确的数据提供给模型但是用户无法改变?
进一步说明
虽然有一些原因可能会使这些字段隐藏在视图之外,但也有正当理由要求用户看到这些字段,例如在公司内部网中,用户希望看到该信息。虽然SQL Server可以使用getdate()
默认值自动生成日期戳,但在Windows身份验证下捕获用户的身份需要从MVC端完成。用户的识别是模型的一部分。
答案 0 :(得分:1)
重要的数据库功能是具有计算属性的能力。如果您将代码的第一个类映射到包含计算属性的表,那么您不希望实体框架尝试更新这些列。但是,您确实希望EF在您插入或更新数据后从数据库中返回这些值。您可以使用DatabaseGenerated注释来标记类中的这些属性以及Computed enum。其他枚举是None和Identity。
[DatabaseGenerated(DatabaseGenerationOption.Computed)]
public DateTime DateCreated { get; set; }
现在让您的数据库在创建记录时生成时间戳。您也可以将DataAnnotation设置为只读
[DatabaseGenerated(DatabaseGenerationOption.Computed)]
[Editable(false)]
public DateTime DateCreated { get; set; }
希望这会有所帮助 的更新强>
// Private
private DateTime _createdOn = DateTime.Now;
// Public property
[Display(Name = "Created On")]
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime CreatedOn
{
get
{
return (_createdOn == DateTime.MinValue) ? DateTime.Now : _createdOn;
}
set { _createdOn = value; }
}
或在视图中。
@Html.HiddenFor(model => model.CommentTime, new { @Value=System.DateTime.Now })
或在控制器中。
public ActionResult Index()
{
return View(new MyViewModel
{
Birth = DateTime.Now
});
}
如果在控制器和/或模型中完成,您可以使用readonly的html属性。
您可以使用自定义编辑器模板:
public class MyViewModel
{
[UIHint("MyHiddenDate")]
public DateTime Date { get; set; }
}
然后定义〜/ Views / Shared / EditorTemplates / MyHiddenDate.cshtml:
@model DateTime
@Html.Hidden("", Model.ToString("dd/MM/yyyy"))
最后在您的视图中使用EditorFor帮助程序:
@model MyViewModel
@Html.EditorFor(x => x.Date)
这将为视图模型的Date属性呈现自定义编辑器模板,从而使用所需格式呈现隐藏字段的值。
<强>更新强>
EditorFor html帮助器没有带HTML属性的重载。在这种情况下,您需要使用更具体的内容,如TextBoxFor:
<div class="editor-field">
@Html.TextBoxFor(model => model.DateCreated , new
{ disabled = "disabled", @readonly = "readonly" })
</div>
您仍然可以使用EditorFor,但您需要在自定义EditorTemplate中使用TextBoxFor:
public class MyModel
{
[UIHint("DateCreated ")]
public string DateCreated { ;get; set; }
}
然后,在Views / Shared / EditorTemplates文件夹中,创建一个DateCreated .cshtml文件。在该文件中,输入:
@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })
答案 1 :(得分:0)
当我发布这个答案时,它基于我迄今为止能够找到的内容。我了解到这是一个&#34;要小心你想要的东西。&#34;提供的其他答案正确地指出,遵循下面显示的方法不是一个好的做法,至少有一个错误的前提,如对话主题中所述。
这仅作为不做的解释。我接受的答案显示了我采用的方法。
答案非常简单而优雅。 Tt只需要一个额外的短语:@readonly="readonly"
。
在更好的背景下,最初的例子是:
<div class="form-group">
@Html.LabelFor(model => model.RoseUserName,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.RoseUserName,
new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.RoseUserName, "",
new { @class = "text-danger" })
</div>
您所做的就是将@readonly="readonly"
添加到EditorFor htmlAttributes中,如下所示:
@Html.EditorFor(model => model.RoseUserName,
new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } })
问题解决了。
答案 2 :(得分:0)
<div class="form-group">
@Html.LabelFor(model => model.RoseUserName,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.RoseUserName,
new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly"} })
@Html.ValidationMessageFor(model => model.RoseUserName, "",
new { @class = "text-danger" })
</div>
///add disabled = "disabled", @readonly = "readonly along with@class = "form-control"
********@Html.EditorFor(model => model.RoseUserName,
new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly"} })