如何在ASP.NET MVC3 Razor中创建只读文本框


118

如何使用Razor视图引擎在ASP.NET MVC3中创建一个只读文本框?

有没有HTMLHelper方法可以做到这一点?

类似于以下内容?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

Answers:


246
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

欢迎您为此创建HTML帮助器,但这只是与其他属性一样的HTML属性。您是否将为具有其他属性的文本框创建HTML Helper?


1
@Shyju抱歉,我缺少属性的@前缀readonly。看到我的编辑。

7
将来,如果在将属性添加到动态对象参数时遇到任何错误,都可以在它们前面加上@。通常,您只会看到与HTML属性匹配的关键字(例如,只读,类等)
Brad Christie 2012年

10
@BradChristie:不;您只需使用@即可使用与C#关键字匹配的属性。
SLaks'1

1
@BradChristie:我听错了您的评论(“关键字”含糊不清)
公开赛(SLaks

1
如果您有多个html属性,则可以执行以下操作:@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

更新: 现在,将HTML属性添加到默认编辑器模板非常简单。它不需要这样做:

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

您只需执行以下操作:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

好处:您无需致电.TextBoxFor等等来获取模板。只是打电话.EditorFor


虽然@Shark的解决方案可以正常工作,并且简单实用,但我的解决方案(我一直使用)是这样的:创建一个editor-template可以处理readonlyattribute的解决方案

  1. 创建一个命名的文件夹EditorTemplates~/Views/Shared/
  2. 创建一个PartialView名为的剃刀String.cshtml
  3. String.cshtml用以下代码填充:

    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" })
    }
    
  4. 在模型类中,将[ReadOnly(true)]属性放在要成为的属性上readonly

例如,

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

现在,您可以简单地使用Razor的默认语法:

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

第一个呈现这样的法线text-box

<input class="text-box single-line" id="field-id" name="field-name" />

第二个将呈现给;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

您可以使用此解决方案的任何类型的数据(DateTimeDateTimeOffsetDataType.TextDataType.MultilineText等)。只需创建一个editor-template


2
+1是因为您使用了“ ViewData.ModelMetadata.IsReadOnly”。我期待MVC将考虑在第4版,这些东西
cleftheris

@cleftheris好,我们现在处于版本5中,MVC仍然没有接受它们;)
ravy amiry 2014年

2
@Javad_Amiry-很好的答案-我已经实现了它,而且在我在“脚手架编辑”页面上单击“保存”之前,它似乎工作得很好。然后发现[ReadOnly(true)]的Properties将导致将NULL而不是真实的Property值发送到数据库-您是否遇到过?
珀西

5

使用TextBoxFor的解决方案是可以的,但是如果您不想看到像EditBox一样时尚的字段(可能会使用户感到困惑),请进行以下更改:

  1. 更改前的剃刀代码

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
    
  2. 变更后

    <!-- New div display-field (after div editor-label) -->
    <div class="display-field">
        @Html.DisplayFor(model => model.Text)
    </div>
    
    <div class="editor-field">
        <!-- change to HiddenFor in existing div editor-field -->
        @Html.HiddenFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>
    

通常,此解决方案可防止编辑字段,但可以显示其价值。无需进行代码隐藏修改。


1
我认为在这里为类的editor-field和display-field提供CSS可能真的很有帮助。
DOK

“此解决方案使文件无法编辑,这是不可理解的是什么意思?请通过编辑您的答案来回应,而不是在注释中(适当时在此处)。
彼得·莫滕森

3

归功于@Bronek和@Shimmy的先前答案:

就像我在ASP.NET Core中做过同样的事情:

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

第一个输入为只读,第二个输入将值传递给控制器​​,并被隐藏。我希望它对使用ASP.NET Core的人有用。



0
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

这对于文本框来说很好。但是,如果您尝试对进行相同操作,checkbox则在使用时尝试使用此方法:

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

但是请不要使用disable,因为disable始终会将默认值发送false到服务器-处于检查或未检查状态。并且readonly不适用于复选框和radio buttonreadonly仅适用于text字段。


下拉列表呢?
user3020047


0

您可以使用以下代码将TextBox创建为只读。

方法一

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

方法2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.