Html.Editor将.textbox添加到元素名称

时间:2017-10-13 15:39:07

标签: c# html razor editorfor

我有一个项目,其中包含一个用于收集注册信息的简单表单。最近我一直在努力为项目添加本地化,​​因为显示给用户的所有文本都是硬编码的。我不确定是什么改变了,但出于某种原因,现在当Razor使用最终成为文本框的Html.EditorFor方法呈现HTML元素时,元素的Name属性附加了“.textbox”。

这会破坏绑定,因此当我收到模型时,所有文本值都为null。这是我所看到的一个例子,Razor代码:

<div class="form-group" ng-class="{ 'has-error': validate && accountForm.FirstName.$invalid }">
        @Html.LabelFor(m => m.FirstName, new { @class = @ViewBag.LabelCssRequired })
        <div class="@ViewBag.TextboxCss">
            @Html.EditorFor(m => m.FirstName, new { htmlAttributes = new { ng_model = "firstName" } })
        </div>
    </div>

这里是渲染的输出:

<input class="text-box single-line form-control ng-valid-maxlength ng-not-empty ng-dirty ng-valid-parse ng-valid ng-valid-required ng-touched" id="FirstName_textbox" maxlength="100" name="FirstName.textbox" ng-model="firstName" required="required" type="text" value="">

它还在id中添加了一个“_textbox”,但我现在并不关心它。出于某种原因,这似乎只发生在类型为“text”的输入元素上。我有另一个使用.EditorFor生成的输入,它具有电子邮件类型,并且没有对名称进行任何修改。

此行为似乎也仅限于Html.EditorFor,如果我使用.TextboxFor,它可以正常工作。

我已经能够通过在Razor中显式设置@Name属性来使绑定工作,但这只掩盖了症状,我想避免为网站上的每个文本输入执行此操作。

之前有没有人见过这种行为,或者知道修复?

1 个答案:

答案 0 :(得分:1)

默认情况下,TextBoxFor帮助程序使用内置模板生成HTML。您可以通过在project root\views\shared\editortemplates文件夹中创建文件来覆盖默认值。

因此,问题可能是由于某些自定义模板存在而引起的。通常,您需要检查名称是匹配数据类型(例如string)还是控件类型(例如TextArea)的文件。如果相应的模型属性上有UIHint属性,则其中指定的自定义文件也可以起作用。