【问题标题】:MVC3 Client Side Validation not working with an Ajax.BeginForm formMVC3 客户端验证不适用于 Ajax.BeginForm 表单
【发布时间】:2012-01-17 12:40:02
【问题描述】:

我在局部视图中有以下表格

@model PartDetail
@using (Ajax.BeginForm("Create", "Part", null, new AjaxOptions { UpdateTargetId =       "update_panel"}))
{
    <h3>New @Model.PartType</h3>
    <p> Serial Number: 
        <strong>
            @Html.EditorFor(model => model.SerialNumber)
            @Html.ValidationMessageFor(model => model.SerialNumber)
        </strong>
    </p>
    <p> Name: 
        <strong>
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </strong>
    </p>
    ...... more relatively boiler plate code here......
    <p>
        <input type="submit" class="btn primary" value="Save Part"/>
    </p>
}

有一个模型

public class PartDetail
{
    public string DateCreated { get; set; }
    [StringLength(255, MinimumLength = 3)]
    public string Description { get; set; }
    public Guid ID { get; set; }
    public string IsActive { get; set; }
    public string Manufacturer { get; set; }
    public IEnumerable<SelectListItem> Manufacturers { get; set; }
    [StringLength(100, MinimumLength = 3)]
    public string Name { get; set; }
    public string PartType { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 3)]
    public string SerialNumber { get; set; }
}

我参考(在我的部分视图的父视图中)

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

没有任何东西得到验证。如果我在“序列号”文本框中不输入任何内容并按“提交”,它就会毫无问题地将其保存到数据库中。

【问题讨论】:

    标签: asp.net-mvc-3 jquery-validate


    【解决方案1】:

    尝试向 AjaxOptions 添加一个 OnBegin 回调,这应该可以工作。

    function validateForm() { 
       return $('form').validate().form(); 
    } 
    
    @using (Ajax.BeginForm("Create", "Part", null, new AjaxOptions { UpdateTargetId = "update_panel", OnBegin = "validateForm" }))
    ...
    

    如果这对您不起作用,替代解决方案可能是使用 jQuery 提交表单。这将是我的首选解决方案。

    <div id="result"></div> 
    
    @using (Html.BeginForm()) 
    { 
    <h3>New @Model.PartType</h3>
    <p>Serial Number: 
        <strong>
            @Html.EditorFor(model => model.SerialNumber)
            @Html.ValidationMessageFor(model => model.SerialNumber)
            </strong>
        </p>
        <p> Name: 
            <strong>
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </strong>
        </p>
        ...... more relatively boiler plate code here......
        <p>
            <input type="submit" class="btn primary" value="Save Part"/>
        </p>
    
        }
    

    jQuery/JS 函数提交表单

        $(function () { 
            $('form').submit(function () { 
    
            $.validator.unobtrusive.parse($('form'));  //added
    
                if ($(this).valid()) { 
                    $.ajax({ 
                        url: this.action, 
                        type: this.method, 
                        data: $(this).serialize(), 
                        success: function (result) { 
                            $('#result').html(result); 
                        } 
                    }); 
                } 
                return false; 
            }); 
        });
    

    【讨论】:

    • 我的局部视图的顶部现在看起来像这样,它仍然没有验证.... @using (Ajax.BeginForm("Create", "Part", null, new AjaxOptions { UpdateTargetId = "update_panel", OnBegin = "validateForm" })) {
    • 贴上警报('test');在 validateForm() 中查看它是否被击中。
    • 我用 jQuery 风格的解决方案更新了我的答案。虽然它不能解决您遇到的问题,但我更喜欢使用 jQuery 而不是 Ajax,并认为我会在这里为您提供选择。
    • 让我实现它并试一试。我的主要目标是让它可靠地运行。无论需要什么技术来做到这一点都是次要的问题。
    • 尝试运行 $.validator.unobtrusive.parse($('form'));提交后
    【解决方案2】:

    在这种情况下,包括进程在内的 javascript 文件的顺序很重要。您包含这些文件的顺序应该是

    jquery.js
    jquery.validate.js
    jquery.validate.unobtrusive.js
    

    当我尝试重新订购时,它对我来说效果很好。试试看。

    【讨论】:

      【解决方案3】:

      检查解决方案/项目的根 Web.config。是否包含以下几行?

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

      不是,添加它们。

      【讨论】:

      • 是的。我应该提到我也检查过。
      【解决方案4】:

      您需要稍微修改您的控制器操作以在 Ajax 请求中进行验证 您捕获部分视图的 RenderHtml 并对其应用您的验证,例如

          //In Controller 
      
      
      
           public string Create(PartDetail model)
              {
                  string RenderHtml = RenderPartialViewToString("PartailViewName", model);
                  return RenderHtml;
              }
      
      
      
      protected string RenderPartialViewToString(string viewName, object model)
              {
                  if (string.IsNullOrEmpty(viewName))
                      viewName = ControllerContext.RouteData.GetRequiredString("action");
      
                  ViewData.Model = model;
      
                  using (StringWriter sw = new StringWriter())
                  {
                      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
                      ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
                      viewResult.View.Render(viewContext, sw);
                      return sw.GetStringBuilder().ToString();
                  }
              }
      

      您必须将 ViewName 和 Model 传递给 RenderPartialViewToString 方法。它将返回您在模型中应用的带有验证的视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多