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

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

有没有可用的 HTMLHelper 方法?

像下面这样吗?

@Html.ReadOnlyTextBoxFor(m => m.userCode)
263809 次浏览
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

您可以为此创建一个 HTML Helper,但是这仅仅是一个 HTML 属性,就像其他属性一样。您会为具有其他属性的文本框制作 HTML 助手吗?

更新: 现在,将 HTML 属性添加到默认编辑器模板非常简单:

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

你可以这样做:

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

好处: 对于模板,您不必调用 .TextBoxFor等等,只需调用 .EditorFor即可。


虽然@Shark 的解决方案工作正常,而且简单有用,但我的解决方案(我总是使用)是这样的: 创建一个可以处理 ABC1属性的 editor-template:

  1. ~/Views/Shared/中创建一个名为 EditorTemplates的文件夹
  2. 创建一个名为 String.cshtml的剃须刀 PartialView
  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. In model class, put the [ReadOnly(true)] attribute on properties which you want to be readonly.

For example,

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

使用 TextBoxFor 的解决方案是可以的,但是如果您使用 不希望看到像 EditBox 风格的字段(对于用户来说可能会有点困惑) ,那么涉及到如下更改:

  1. 更改前的剃刀代码

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

    <!-- 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>
    

Generally, this solution prevents field from editing, but shows value of it. There is no need for code-behind modifications.

以下是“ Bronek”和“ Shimmy”对上一个问题的回答:

这就像我在 ASP.NET 核心中做了同样的事情:

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

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

 @Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

这对于文本框来说很好。但是,如果您尝试对 checkbox做同样的事情,那么如果您正在使用它,请尝试使用它:

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

但是不要使用 disable,因为 Disable 总是将默认值 false发送到服务器——要么处于选中状态,要么处于未选中状态。而且 readonly对复选框和 radio button不起作用。readonly只适用于 text字段。

可以使用下面的代码创建只读的 TextBox。

方法1

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

方法2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})