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

问题描述:

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

这打破了绑定,所以当我收到我的模型时,所有的文本值都是空的。下面是我所看到的,剃刀代码的例子:

<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=""> 

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

此行为似乎也被限制为Html.EditorFor,如果我使用.TextboxFor,它工作正常。

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

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

+0

你有没有在'project root \ views \ shared \ editortemplates'中有任何机会?我相信这不应该发生,一个流氓编辑器模板会解释这种行为。 –

+0

@Balázs就是这样!不知何故,在其中一个模板中,得到输出的文本框名称为“文本框”,所以这似乎是它添加“.textbox”的原因。我不确定这是怎么发生的,因为到目前为止我还没有任何理由去触摸这些文件。如果你想以此作为答案,我会接受它。现在想知道如何将这些文件添加到文件中 – KSF

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

因此,问题可能是由于存在一些自定义模板造成的。通常,您需要检查名称与数据类型匹配的文件(如string)或控件类型(如TextArea)。如果相应的模型属性具有UIHint属性,则其中指定的自定义文件也可以发挥作用。