2013-05-21 39 views
1

我刚刚完成了我的窗体的可视化逻辑,现在我想要使用asp.net mvc 3提供的客户端验证。然而,即使我正在追踪一些例子,我也无法使其发挥作用,我不知道可能是什么原因。客户端验证从哪个使用部分视图

这里是我的主视图:

@model List<DataAccess.MCS_DocumentFields> 

@{ 
    ViewBag.Title = "Documents"; 
} 

<div id="drawForm"> 
@using (Html.BeginForm("RecieveDataFromDocument", "Forms", FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 
    <table border="1"> 
     <colgroup> 
      <col span="1" style="width: 10%;" /> 
      <col span="1" style="width: 40%;" /> 
      <col span="1" style="width: 25%;" /> 
      <col span="1" style="width: 25%;" /> 
     </colgroup> 
     @Html.Partial("_PartialHeader", Model) 
     @Html.Partial("_PartialDrawing", Model) 
     @Html.Partial("_PartialBody", Model) 
     @Html.Partial("_PartialFooter", Model) 
    </table> 
    if (ViewBag.Status == 1) 
    { 
     <button type="submit">Save</button> 
    } 
    else 
    { 
     @Html.ActionLink("Back", "Index") 
    } 
} 
</div> 

没有太多的实际这里。大部分逻辑都在我的偏见中。我使用数据注释,所以我认为默认情况下会有一些客户端验证,但似乎并非如此。我所做的是确保我有

<appSettings> 

    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

</appSettings> 

添加到我的web.config。在我看来,你可以看到我已经添加了

@Html.ValidationSummary(true) 

不知道这是否正确,但它在那里。此外,在我是从那里寻找的例子是:

<div class="editor-label"> 

    @Html.LabelFor(model => model.Name) 

</div> 

<div class="editor-field"> 

    @Html.TextBoxFor(model => model.Name) 

    @Html.ValidationMessageFor(model => model.Name) 

</div> 

我没有这样<div>标签和这样的类名但是当我开始在viewsource我的应用程序可以看到每个输入此:

Name comes from DB 
       <input data-val="true" data-val-required="The FieldValue field is required." name="[4].FieldValue" type="hidden" value="Name comes from DB" /> 

我认为这足以让客户端验证发生。但是,因为我没有得到任何我在我的部分观点一个仅增加了测试以下:

<div class="editor-label"> 
        @Html.DisplayFor(x => Model[i].QuestionText) 
        </div> 
        <div class="editor-field"> 
        @Html.TextBox("datepicker", "", new { @class = "datepicker" }) 
        @Html.ValidationMessageFor(x => Model[i].QuestionText) 
        </div> 
        @Html.HiddenFor(x => Model[i].Id) 
        //...some code... 
        <div class="editor-field"> 
        @Html.EditorFor(x => Model[i].FieldValue) 
        @Html.ValidationMessageFor(x => Model[i].FieldValue) 
        </div> 
        @Html.HiddenFor(x => Model[i].Id) 
        //...more code.. 

但即使是这两个领域在验证失败时不会生成错误。所以我想我要么错过了什么,要么我做错了什么。我怀疑这种验证是否以这种方式发挥作用 - 部分?

+0

是否定义限制 最好的问候/属性上的模型? – Guanxi

+0

我只加[我需要]留下一些字段空。我添加了更多的限制,但没有任何更改 – Leron

+0

您是否包含了验证所需的js文件? – Guanxi

回答

6

更换

@Html.Partial("_PartialHeader", Model) 
@Html.Partial("_PartialDrawing", Model) 
@Html.Partial("_PartialBody", Model) 
@Html.Partial("_PartialFooter", Model) 

在mvc客户端验证(我在mvc4上工作,但我认为它在你的情况是一样的),有一些步骤来检查:

  1. 在Web中。配置

    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    
  2. 脚本具有在布局(或主页)

    <script src="/Scripts/jquery.validate.js"></script> 
    <script src="/Scripts/jquery.validate.unobtrusive.js"></script> 
    <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
    
  3. 给模型验证错误消息属性来显示(例如)

    public class ContactForm 
    { 
    [Display(Name = "Mail :"), 
    Required(AllowEmptyStrings = false, ErrorMessage = "Mail required"), 
    RegularExpression("^(|[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+[.][a-zA-Z]{2,3})$", ErrorMessage = "Mail not valid"), 
    Remote("IsValidMail", "Validate", HttpMethod="GET")] /* remote validation */ 
    public string Mail { get; set; } 
    
    [Display(Name = "Message :"), 
    Required(AllowEmptyStrings = false, ErrorMessage = "Message required"), 
    StringLength(maximumLength: 400, ErrorMessage="Message too long")] 
    public string Message { get; set; } 
    
    public ContactForm() { } 
    

    }

  4. 在视图中,显示错误消息

    @Html.ValidationMessageFor(x=>x.Mail) 
    

    @Html.ValidationSummary(false, null, new { @id = "ValidationSummary" })  
    

    像你一样。你可能需要在页面加载(在ajax调用的成功事件或$(function(){})中重新绑定验证。局部视图)

    ///because the page is loaded with ajax, the validation rules are lost, we have to rebind them: 
        $('#form').removeData('validator'); 
        $('#form').removeData('unobtrusiveValidation'); 
        $("#form").each(function() { $.data($(this)[0], 'validator', false); }); //enable to display the error messages 
        $.validator.unobtrusive.parse("#form"); 
    

小心局部视图不要双击脚本并启用验证。

+0

我已经尝试过上述方法,但没有在部分视图中获取客户端验证 – Debashrita

+0

这可以正常工作,请确保您使用的窗体是正确的选择器。在上面的答案表格中选择id为'form'。 – Satyajit

0

尝试添加这些文件,也许可以帮助你:

<script src="/@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">  </script> 
<script src="/@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"  type="text/javascript"></script> 

<script src="/@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script> 
<script src="/@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script> 
<script src="/@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script> 
+0

不行,同样的行为。 – Leron

0

只是出于兴趣,你有没有试过,以获得与

@Html.EditorFor(m => Model, "_PartialHeader") 
@Html.EditorFor(m => Model, "_PartialDrawing") 
@Html.EditorFor(m => Model, "_PartialBody") 
@Html.EditorFor(m => Model, "_PartialFooter") 
+0

他,他试过 - 没有任何反应。 – Leron