0

验证渲染问题

我的模型中有这些数据注释:

    [Required(ErrorMessage = "Adres is een verplicht veld")]
    [MaxLength(250)]
    public string D_Address { get; set; }

    [Required(ErrorMessage = "Huisnummer is verplicht")]
    public int D_AddressNumber { get; set; }

    public string D_AddressExtra { get; set; }

    [Required]
    public int CapacityRate { get; set; }

    [Required(ErrorMessage = "Postcode is een verplicht veld")]
    [MaxLength(35)]
    public string D_Zipcode { get; set; }

    [Required(ErrorMessage = "Plaats is een verpicht veld")]
    [MaxLength(250)]
    public string D_City { get; set; }

在我的cshtml中:

@using (Html.BeginForm())
{ 
    @Html.TextBoxFor(m => m.D_Address, new { @class = "span6" })
    @Html.TextBoxFor(m => m.D_AddressNumber, new { @class = "span2" })
    @Html.TextBoxFor(m => m.D_AddressExtra, new { @class = "span2" })
    <br />
    @Html.ValidationMessageFor(m => m.D_Address, null, new { @class = "label label-important" })
    @Html.ValidationMessageFor(m => m.D_AddressNumber, null, new { @class = "label label-important" })
    <br />
    @Html.TextBoxFor(m => m.D_Zipcode, new { @class = "span4" })
    @Html.ValidationMessageFor(m => m.D_Zipcode, null, new { @class = "label label-important" })
    <br />
    @Html.TextBoxFor(m => m.D_City, new { @class = "span4" })
    @Html.ValidationMessageFor(m => m.D_City, null, new { @class = "label label-important" })
    <br />
    <input id="Submit1" type="submit" value="Versturen" class="btn btn-primary" />
    <br />
    @Html.ValidationSummary();
}

在我的本地机器上,它呈现如下:

<form action="/validatie/quoterequest" method="post">

<input class="span6" data-val="true" data-val-required="Adres is een verplicht veld"     id="D_Address" name="D_Address" type="text" value="" />

<input class="span2" data-val="true" data-val-number="The field D_AddressNumber must be a number." data-val-required="Huisnummer is verplicht" id="D_AddressNumber" name="D_AddressNumber" type="text" value="" />

<input class="span2" id="D_AddressExtra" name="D_AddressExtra" type="text" value="" /><br />
<span class="field-validation-valid label label-important" data-valmsg-for="D_Address" data-valmsg-replace="true"></span><span class="field-validation-valid label label-important" data-valmsg-for="D_AddressNumber" data-valmsg-replace="true"></span>    <br />

<input class="span4" data-val="true" data-val-required="Postcode is een verplicht veld" id="D_Zipcode" name="D_Zipcode" type="text" value="" /><span class="field-validation-valid label label-important" data-valmsg-for="D_Zipcode" data-valmsg-replace="true"></span>    <br />
<input class="span4" data-val="true" data-val-required="Plaats is een verpicht veld" id="D_City" name="D_City" type="text" value="" /><span class="field-validation-valid label label-important" data-valmsg-for="D_City" data-valmsg-replace="true"></span>    <br />

<input id="Submit1" type="submit" value="Versturen" class="btn btn-primary" /><br />
<div class="validation-summary-valid" data-valmsg-summary="true"><ul>
<li style="display:none"></li>
</ul></div>

</form>

在我的服务器上:

<form action="/Validatie/Quoterequest" method="post">

<input class="span6" id="D_Address" name="D_Address" type="text" value="" />

<input class="span2" data-val="true" data-val-number="The field D_AddressNumber must be a number." data-val-required="Huisnummer is verplicht" id="D_AddressNumber" name="D_AddressNumber" type="text" value="" />

<input class="span2" id="D_AddressExtra" name="D_AddressExtra" type="text" value="" />    <br /> <span class="field-validation-valid label label-important" data-valmsg-for="D_Address" data-valmsg-replace="true"></span><span class="field-validation-valid label label-important" data-valmsg-for="D_AddressNumber" data-valmsg-replace="true"></span>    <br /> 

<input class="span4" id="D_Zipcode" name="D_Zipcode" type="text" value="" /><span class="field-validation-valid label label-important" data-valmsg-for="D_Zipcode" data-valmsg-replace="true"></span>    <br /> 

<input class="span4" id="D_City" name="D_City" type="text" value="" /><span class="field-validation-valid label label-important" data-valmsg-for="D_City" data-valmsg-replace="true"></span>    <br />     

<input id="Submit1" type="submit" value="Versturen" class="btn btn-primary" />     <br /> 
<div class="validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li> </ul></div>

</form> 

我也有这个信息本地机器 IISVersion :C:\Windows\Microsoft.NET\Framework\v4.0.30319\

 ProcesVersionInfo : File: C:\Program Files (x86)\IIS Express\iisexpress.exe InternalName: iisexpress.exe 
OriginalFilename: iisexpress.exe.mui 
FileVersion: 8.0.8418.0 (winmain(eokim).120521-1311) 



FileDescription: IIS Express Worker Process
 Product: Internet Information Services 
ProductVersion: 8.0.8418.0 
Debug: False
 Patched: False 
PreRelease: False 
PrivateBuild: True 
SpecialBuild: False 
Language: Language Neutral

在服务器上IISVersion : C:\Windows\Microsoft.NET\Framework\v4.0.30319\

ProcesVersionInfo : File: C:\Windows\SysWOW64\inetsrv\w3wp.exe 
InternalName: w3wp.exe OriginalFilename: w3wp.exe.mui 
FileVersion: 7.5.7600.16385 (win7_rtm.090713-1255) 
FileDescription: IIS Worker Process Product: Internet Information Services ProductVersion: 7.5.7600.16385
 Debug: False
 Patched: False
 PreRelease: False 
PrivateBuild: False 
SpecialBuild: False 
Language: Taalonafhankelijk
4

1 回答 1

0

我在 VS2010 的 Windows7 x64 MVC4 中遇到了类似的症状。即使以简单的形式,代码也没有呈现 data-val 属性。

我现在已经解决了!

要调试,首先尝试使用您的模型和“添加”>“视图”菜单选项创建一个强类型的“编辑”视图。查看您期望的属性是否显示在创建的视图中。如果没有,并且像我一样,您发现没有自动添加任何字段,那么您的问题是模型定义。

你可能有类似...

public class MyModel 
{
     [Required(ErrorMessage = "or else!")]

     public string My_Broken_DataValEmittingProperty;
}

您需要将其修改为:

public class MyModel 
{
     [Required(ErrorMessage = "or else!")]

     public string My_Working_DataValEmittingProperty { get; set; }
}

现在,重新构建您的解决方案并再次尝试添加>查看。请记住,这是使用反射工作的,因此需要将其编译到 DLL 中。如果这有效,您还会发现您现在可以从 EditorFor 方法获取 data-val 属性。

假设您正在将 DLL 复制到服务器环境,您的源代码是否真的代表了您认为正在部署的已编译 DLL?我会重新编译调试和发布版本,在本地测试,然后将发布版本复制到服务器。

--

尽管如此,我所经历的过程可能会帮助您进一步调试。

我最初认为这是 jQuery 版本控制或事件问题,所以做了以下修改和检查:
1) web.config - ClientVlidationEnabled 和 UnobtrusiveJavascriptEnabled 都是 true。
2) 这些属性在正确的 web.config 文件中 - 最外面的一个
3) 简化视图以避免完全使用包 - 包可以重新排序文件
4) 将 jQuery 降级为 MVC4 附带的默认版本
5) 简化的表单避免使用部分 - 部分可能缺少导致相同问题的 formContext
6) 在 _Layout.cshtml 文件中以该顺序显式引用 jQuery、jQuery.validate 和 jQuery.validate.unobtrusive。
7) 在 FireBug 中检查渲染的 HTML,而不是依赖于在浏览器中查看源代码

我的项目是 MVC3 升级到 MVC4,所以我将所有自定义文件导入到一个原始的 MVC4 项目中,以确保我没有错过任何东西。我相信答案在于找出为什么 data-val 属性不是在 EditorFor 方法中通过设计呈现的。代码注释说:

// Only render attributes if unobtrusive client-side validation is enabled, and then
// only if we've never rendered validation for a field with this name in this form. 
// Also, if there's no form context, then we can't render the attributes (we'd have no
// <form> to attach them to).

请记住,这些是 Helper 方法。因此,作为一种解决方法,您可以将“帮助器”方法的输出手动输入到视图中,从而节省大量时间。

祝你好运!

于 2013-10-11T10:38:13.640 回答