我刚刚遇到了Razor引擎的一个非常奇怪的行为,即在表单中为输入添加不显眼的验证属性。在某些情况下,不会添加属性。
因此,我在同一页面上有两个类似的表单,具有相似的输入元素。必须将它们提交给不同的网址。 从模型方面来说,我有一些DataAnnotations属性,应用于属性以进行客户端验证。
这是我的ViewModel简化代码:
public class ApplicantPersonalInfo
{
[Required]
[Display(Name = "First Name")]
[StringLength(20, MinimumLength = 2)]
[RegularExpression(@"^[ÀàÂâÆæÇçÉéÈèÊêËëÎîÏïÔôŒœÙùÛûÜüŸÿa-zA-Z \.‘'`-]+$", ErrorMessage = "First Name is in incorrect format")]
public string FirstName { get; set; }
}
现在我要创建两个表单。对于他们中的每一个,动作url可以动态地不同(我使用jQuery Form Plugin中的ajaxSubmit
提交它们),这就是为什么我决定不使用Html.BeginForm
辅助方法,而是使用简单的<form>
创建它们标签。所以我的代码是:
<form id="form1">
@Html.TextBoxFor(m => Model.FirstName, new { id = "firstName1" })
</form>
<form id="form2">
@Html.TextBoxFor(m => Model.FirstName, new { id = "firstName2" })
</form>
最有趣的是生成的HTML代码:
<form id="form1">
<input data-val="true" data-val-length="The field First Name must be a string with a minimum length of 2 and a maximum length of 20." data-val-length-max="20" data-val-length-min="2" data-val-regex="First Name is in incorrect format" data-val-regex-pattern="^[ÀàÂâÆæÇçÉéÈèÊêËëÎîÏïÔôŒœÙùÛûÜüŸÿa-zA-Z \.‘'`-]+$" data-val-required="The First Name field is required." id="firstName1" name="FirstName" type="text" value=""/>
</form>
<form id="form2">
<input id="firstName2" name="FirstName" type="text" value=""/>
</form>
请参阅?所有这些验证属性都不适用于第二个输入!
但是如果使用Html.BeginForm
生成表单,请执行以下操作:
@using (Html.BeginForm("NotExistingController", "NotExisitngAtion", FormMethod.Post, new { id = "form1" }))
{
@Html.TextBoxFor(m => Model.HomeOwner.FirstName, new { id = "firstName1" })
}
<form id="form2">
@Html.TextBoxFor(m => Model.HomeOwner.FirstName, new { id = "firstName2" })
</form>
生成的html代码在两个输入中都包含属性:
<form action="/NotExisitngAtion/NotExistingController" id="form1" method="post">
<input data-val="true" data-val-length="The field First Name must be a string with a minimum length of 2 and a maximum length of 20." data-val-length-max="20" data-val-length-min="2" data-val-regex="First Name is in incorrect format" data-val-regex-pattern="^[ÀàÂâÆæÇçÉéÈèÊêËëÎîÏïÔôŒœÙùÛûÜüŸÿa-zA-Z \.‘'`-]+$" data-val-required="The First Name field is required." id="firstName1" name="FirstName" type="text" value="" />
</form>
<form id="form2">
<input data-val="true" data-val-length="The field First Name must be a string with a minimum length of 2 and a maximum length of 20." data-val-length-max="20" data-val-length-min="2" data-val-regex="First Name is in incorrect format" data-val-regex-pattern="^[ÀàÂâÆæÇçÉéÈèÊêËëÎîÏïÔôŒœÙùÛûÜüŸÿa-zA-Z \.‘'`-]+$" data-val-required="The First Name field is required." id="firstName2" name="FirstName" type="text" value="" />
</form>
我对这种行为感到很困惑。我已经尝试过 - 您可以使用Html.BeginForm
添加任意数量的表单 - 每个表单都有一组验证属性;但是如果你使用简单的<form>
标签添加&gt; 1表单,则从第二个表单开始缺少属性。
所以我错过了什么,或者是Razor引擎中的错误?