【问题标题】:asp.net mvc3 jquery ui dialog and client validationasp.net mvc3 jquery ui 对话框和客户端验证
【发布时间】:2011-06-22 02:13:35
【问题描述】:

我在 asp.net mvc3 应用程序中的客户端验证有问题。

我的代码看起来:

function loadEditCategoryDialog(categoryId) {
    $.ajax({
        url : "/rovastamp3/Admin/CategoryEditDialog",
        data : "categoryId="+categoryId,
        success : function(data){
            $("#popup_dialog").html(data);
            $("#popup_dialog").dialog({        
                modal: true,
                draggable: false,
                resizable: false,
                title: "Upravit kategorii",
                width: 600,
                height: 500,
            });                             
        }
    });
 }

控制器:

[HttpGet]
public ActionResult CategoryEditDialog(int categoryId)
{
    CategoryEditViewModel categoryEditViewModel = new CategoryEditViewModel();
    categoryEditViewModel.Category = _postAuctionCategoryRepo.Query()
        .SingleOrDefault(x => x.Id == categoryId);

    return PartialView(categoryEditViewModel);
}

[HttpPost]
public ActionResult CreateNewCategory(CategoryEditViewModel categoryEditViewModel)
{
    if (ModelState.IsValid)
    {
        return RedirectToAction("Index");
    }
    return View("CategoryEditDialog", categoryEditViewModel);
}

最后是我的部分观点:

@model Rovastamp.MVC3.ViewModels.AdminController.CategoryEditViewModel
<h2>Upravit kategorii @Model.Category.Name</h2>
@{Html.EnableClientValidation();}
@using (Html.BeginForm("CreateNewCategory", "Admin"))
{ 
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Objednávkový formulář</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Category.Name) 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Category.Name) 
            @Html.ValidationMessageFor(model => model.Category.Name) 
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Category.Position) 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Category.Position) 
            @Html.ValidationMessageFor(model => model.Category.Position) 
        </div>

        <input  type="submit" value="Upravit" class="submit_button" />               
    </fieldset>
}

在我的 web.config 中,我打开了 UnobtrusiveJavaScript 和 ClientValidatin 应用设置。

如果我点击 jquery ui 对话框上的提交按钮,mvc 会在没有客户端验证的情况下完全刷新?

问题出在哪里?

感谢您的帮助

编辑:

在我的布局页面中,我包含以下脚本:

  • jquery.unobtrusive-ajax.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

编辑 2

在我的例子中我放了:

jQuery.validator.unobtrusive.parse('#popup_dialog');

在我调用 jquery ui 对话框和客户端验证之前完美运行。

【问题讨论】:

    标签: asp.net-mvc validation jquery-ui dialog


    【解决方案1】:

    这是因为您将 PartialView 加载到已经被 jquery.validator.unobtrusive 库解析的 View 中。您需要指示库重新解析页面以考虑您注入的 PartialView 验证属性。阅读我的this blog post 的主题,希望能回答您的问题。

    【讨论】:

    • +1 希望我能给你更多的大卫。正是我一直需要的。
    • @gnome :) 你可以打开他的个人资料并投票赞成他所有的答案和问题,一切皆有可能
    • @Omu:虽然这意味着所有的选票都可能被视为无效,因为这些选票可能会被视为选票欺诈。所以我不会推荐它。
    • 这对我不起作用,直到我指定了比需要解析的精确形式,正如乔纳森的回答所指出的那样。即$.validator.unobtrusive.parse("#editForm");
    【解决方案2】:

    除了像这样连接你的提交按钮

        $("#SubmitButton").click(function(){
        if (!$("#editForm").valid()){
            return false;
        }
          });
    

    您需要指定要解析的 html 表单,使用默认构造函数对我不起作用。

    $.validator.unobtrusive.parse("#editForm");   
    

    我正在尝试找出一种方法,这样您就不必连接每个表单上的每个提交按钮,如果我找到方法将在此处发布。

    【讨论】:

      【解决方案3】:

      我在这个问题上苦苦挣扎, 几个小时后,我得出结论,jQuery 在表单元素之外渲染了 DIALOG HTML 元素。 由于 jQuery.Validation 插件只在 FORM 元素中起作用, 必须在 Form 范围内返回 Dialog,这可以通过以下打开事件处理来完成:

        $('#dialogDivId').dialog({
            autoOpen: false,
            width: 500,
            height: 500,
            minheight: options.minheight,
            minwidth: options.minwidth,
            modal:false,
            open: function (type, data) {
                   $(this).appendTo($('form')); // reinsert the dialog to the form
            }   // And Solve your validation inside Jquery dialog
      });
      

      【讨论】:

      • 这是正确的问题,但它会干扰对话 UI。我解决了这个问题:open: function (type, data) { $(this).wrap("&lt;form /&gt;"); }
      【解决方案4】:

      您是否包含用于客户端验证的正确 JavaScript 文件?

      在执行提交操作时检查 JavaScript 控制台,我敢打赌那里有一个错误导致 JavaScript 出错,然后表单的默认提交操作正在启动。

      【讨论】:

      • 您可能需要 MicrosoftAjax.jsMicrosoftMvcAjax.js ?不过,我不确定。我还没有机会使用不显眼的 jquery 逻辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多