如何让我的EditorFor禁用?

时间:2015-06-25 22:14:34

标签: razor asp.net-mvc-5

我有一个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字段将正确的数据提供给模型但是用户无法改变?

This is what the default Create form looks like

进一步说明 虽然有一些原因可能会使这些字段隐藏在视图之外,但也有正当理由要求用户看到这些字段,例如在公司内部网中,用户希望看到该信息。虽然SQL Server可以使用getdate()默认值自动生成日期戳,但在Windows身份验证下捕获用户的身份需要从MVC端完成。用户的识别是模型的一部分。

3 个答案:

答案 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" } })

问题解决了。

This is the EditorFor with a <code>@readonly="readonly" added to the htmlAttributes</code>

答案 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"} })