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

Shy*_*yju 114 c# html-helper readonly-attribute razor asp.net-mvc-3

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

像这样的东西?

__CODE__

小智 238

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Run Code Online (Sandbox Code Playgroud)

欢迎您为此创建一个HTML Helper,但这只是一个HTML属性,就像任何其他属性一样.您是否会为具有其他属性的文本框创建HTML帮助程序?

  • @BradChristie:不; 你只需要一个`@`来使用匹配**C#**关键字的属性. (9认同)
  • 将来,如果在向动态对象参数添加属性时出现任何类型的错误,可以在它们前面加上`@`.您通常只能使用与HTML属性匹配的关键字(例如,readonly,class等)来查看它 (7认同)

jav*_*iry 31

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

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Run Code Online (Sandbox Code Playgroud)

你只需要这样做:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Run Code Online (Sandbox Code Playgroud)

好处:您不必.TextBoxFor为模板打电话等.打电话吧.EditorFor.


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

  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" })
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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; }
}
Run Code Online (Sandbox Code Playgroud)

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

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
Run Code Online (Sandbox Code Playgroud)

第一个,呈现这样的正常text-box:

<input class="text-box single-line" id="field-id" name="field-name" />
Run Code Online (Sandbox Code Playgroud)

第二,将呈现;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
Run Code Online (Sandbox Code Playgroud)

您可以使用此解决方案的任何类型的数据(DateTime,DateTimeOffset,DataType.Text,DataType.MultilineText等).只需创建一个editor-template.

  • +1,因为您使用了"ViewData.ModelMetadata.IsReadOnly".我期待MVC会在版本4中考虑这些内容. (2认同)
  • @Javad_Amiry - 很棒的答案 - 我已经实现了它,它似乎工作得很好,直到我点击Scaffolded Edit页面上的Save.然后事实证明,使用[ReadOnly(true)]的属性将导致将NULL发送到数据库而不是真实的属性值 - 您是否遇到过此问题? (2认同)

Bro*_*nek 5

使用TextBoxFor的解决方案是可以的但是如果你不想看到像EditBox那样的字段(它可能对用户来说有点困惑)涉及的变化如下:

1.更改之前的剃刀代码

<div class="editor-field">
     @Html.EditorFor(model => model.Text)
     @Html.ValidationMessageFor(model => model.Text)
</div>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

通常,此解决方案禁用针对编辑的文件但显示其值.不需要代码隐藏修改.