Answers:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
欢迎您为此创建HTML帮助器,但这只是与其他属性一样的HTML属性。您是否将为具有其他属性的文本框创建HTML Helper?
@
。通常,您只会看到与HTML属性匹配的关键字(例如,只读,类等)
@
即可使用与C#关键字匹配的属性。
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
更新: 现在,将HTML属性添加到默认编辑器模板非常简单。它不需要这样做:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
您只需执行以下操作:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
好处:您无需致电.TextBoxFor
等等来获取模板。只是打电话.EditorFor
。
虽然@Shark的解决方案可以正常工作,并且简单实用,但我的解决方案(我一直使用)是这样的:创建一个editor-template
可以处理readonly
attribute的解决方案:
EditorTemplates
中~/Views/Shared/
PartialView
名为的剃刀String.cshtml
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" />
您可以使用此解决方案的任何类型的数据(DateTime
,DateTimeOffset
,DataType.Text
,DataType.MultilineText
等)。只需创建一个editor-template
。
使用TextBoxFor的解决方案是可以的,但是如果您不想看到像EditBox一样时尚的字段(可能会使用户感到困惑),请进行以下更改:
更改前的剃刀代码
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
变更后
<!-- 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>
通常,此解决方案可防止编辑字段,但可以显示其价值。无需进行代码隐藏修改。
归功于@Bronek和@Shimmy的先前答案:
就像我在ASP.NET Core中做过同样的事情:
<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
字段。
@
前缀readonly
。看到我的编辑。