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

如何在ASP.NET MVC3中使用Razor视图引擎创build只读文本框? 有HTMLHelper方法可用来做到这一点?

像这样的东西?

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

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

欢迎您为此制作一个HTML助手,但这仅仅是一个像其他任何HTML属性。 你会为具有其他属性的文本框制作HTML助手吗?

更新:现在添加html属性到默认编辑器模板非常简单。 意思,而不是这样做:

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

你只需要做到这一点:

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

优点:您不必为模板调用.TextBoxFor等。 只需调用.EditorFor


虽然@鲨鱼的解决scheme正常工作,它是简单而有用的,我的解决scheme(我总是使用)是这样的创build一个editor-template ,可以处理readonly属性

  1. ~/Views/Shared/创build一个名为EditorTemplates的文件夹,
  2. 创build一个名为String.cshtml的razorPartialView
  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" /> 

您可以将此解决scheme用于任何types的数据( DateTimeDateTimeOffsetDataType.TextDataType.MultilineText等)。 只需创build一个editor-template

TextBoxFor的解决scheme是可以的,但是如果你不想看到像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> 

一般来说,这个解决scheme禁止提交编辑,但显示它的价值。 不需要代码隐藏修改。

与由@Bronek和@Shimmy以前的答复信贷

这是我在ASP.NET Core中完成的

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

第一个input是只读的,第二个input是传递给控制器​​的,并且是隐藏的。希望对于使用ASP.Net Core的人有用。

  @Html.TextBox("Recivers", 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因为禁用始终将默认值false发送到服务器,无论它处于选中状态还是未选中状态。 而readonly不适用于checkbox和radio buttonreadonly只适用于text字段。