我有一个项目,其中包含一个用于收集注册信息的简单表单。最近我一直在努力为项目添加本地化,因为显示给用户的所有文本都是硬编码的。我不确定是什么改变了,但出于某种原因,现在当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属性来使绑定工作,但这只掩盖了症状,我想避免为网站上的每个文本输入执行此操作。
之前有没有人见过这种行为,或者知道修复?
答案 0 :(得分:1)
默认情况下,TextBoxFor
帮助程序使用内置模板生成HTML。您可以通过在project root\views\shared\editortemplates
文件夹中创建文件来覆盖默认值。
因此,问题可能是由于某些自定义模板存在而引起的。通常,您需要检查名称是匹配数据类型(例如string
)还是控件类型(例如TextArea
)的文件。如果相应的模型属性上有UIHint
属性,则其中指定的自定义文件也可以起作用。