如何在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
属性 :
- 在
~/Views/Shared/
创build一个名为EditorTemplates
的文件夹, - 创build一个名为
String.cshtml
的razorPartialView
-
用这个代码填充
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" }) }
-
在模型类中,将
[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的数据( DateTime
, DateTimeOffset
, DataType.Text
, DataType.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 button
。 readonly
只适用于text
字段。