点击保存按钮时,Jquery对话框部分视图服务端验证。

3

我有一个表格,显示数据。表格的每一行都有编辑按钮。当点击编辑按钮时,会出现一个jquery对话框,里面是用户信息的编辑表单,还有保存和取消按钮。这个表单实际上就是一个部分视图,按钮是部分视图的一部分。

<button name="button" class="button" id="editCurrentRow" onclick="EditCurrentRow(@item.ID); return false;">

$("#editResult").dialog({
    title: 'Edit Admin',
    autoOpen: false,
    resizable: false,
    height: 500,
    width: 600,
    show: { effect: 'drop', direction: "up" },
    modal: true,
    draggable: true,
    open: function (event, ui) {
        $(this).load('@Url.Action("EditAdmin", "AdminSearchResult")', { id: 1 , isEdit : true }); // pass par from function EditCurrentRow(par) in pacle of 1

    },
    close: function (event, ui) {
        $(this).dialog('close');
    }
});

点击编辑按钮后,我会弹出一个对话框,其中包含正确的值。当没有验证错误(服务器端验证)时,保存按钮正常工作,但一旦出现验证错误,部分页面就会在新页面中打开。取消按钮正常工作。 我的部分视图

@using (Ajax.BeginForm("EditAdmin", "AdminSearchResult", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "editPanel" }))
{
    <div class="editPanel">

        // this is where my html control is 
        <button name="button" value="save" class="button" id="SubmitButton">Save</button>
        &nbsp;
        <button name="button" value="cancel" class="button">Cancel</button>

    </div>
}

我的控制器Action结果是

[HttpPost]
    public ActionResult EditAdmin(int id, Administration admin, string button, bool isEdit = false)
    {            
        if (button == "save")
        {
            var errors = admin.Validate(new ValidationContext(admin, null, null));

            if (errors.Count() == 0)
            {                    
                return RedirectToAction("AdminSearchResult", "AdminSearchResult");
            }
            else
            {
                foreach (var error in errors)
                    foreach (var memberName in error.MemberNames)
                        ModelState.AddModelError(memberName, error.ErrorMessage);

                return PartialView("EditAdmin", admin);
            }
        }

        if (button == "cancel")
        {
            return RedirectToAction("AdminSearchResult", "AdminSearchResult");
        }

        return View();
    }

我认为对话框中的任何按钮点击方法都应该进行ajax化和json化。所以我尝试做如下操作:

<script src="../../Scripts/jquery-1.4.4.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.min.js")" type="text/javascript">  </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {

    $("#SubmitButton").click(function () {

        var id = $('#txtID').val();
        var lName = $('#txtLastName').val();
        var mName = $('#txtMiddleName').val();
        var fName = $('#txtFirstName').val();
        var uName = $('#txtUserName').val();
        var email = $('#txtEmail').val();
        var uRole = $('#ddlUserRoleName').val();
        var active = $('#chkActive').val();

        var admin = {
            ID: id,
            LastName: lName,
            MiddleName: mName,
            FirstName: fName,
            userName: uName,
            emailAddress: email,
            IsActive: active,
            UserRole: uRole
        }

        $.ajax({
            url: '@Url.Action("EditAdmin", "AdminSearchResult")',
            type: 'POST',
            dataType: 'html',
            contentType: "application/json; charset=utf-8",
            data: 'JSON.stringify(admin)',
            success: function (result) {
                alert(result);
                if (result.success) {
                    alert("Success");
                } else {
                    alert("Fail");
                    $('#editPanel').html(result);
                }
            }
        });
        return false;
    });
});   

</script

问题在于添加了 $.ajax 调用后,在 $("#SubmitButton").click(function () 中,当点击按钮时它根本不起作用。我希望它在没有服务器和客户端验证错误发生时保存,并且如果出现错误消息,应该在对话框中显示。
另外,在我的 web.config 文件中,我已经设置了适当的验证设置。
<appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

谢谢


你能在Chrome浏览器上打开这个页面吗?如果控制台上有任何信息,请打开Chrome开发工具并将消息粘贴到那里。 - Naveen
2个回答

5

你应该尝试使用无障碍的客户端验证示例

JQuery

$('#BTN').click(function () {
    var $formContainer = $('#formContainer');
    var url = $formContainer.attr('data-url');
    $formContainer.load(url, function () {
        var $form = $('#myForm');
        $.validator.unobtrusive.parse($form);
        $form.submit(function () {
            var $form = $(this);
            if ($form.valid()) {
                $.ajax({
                    url: url,
                    async: true,
                    type: 'POST',
                    data: JSON.stringify("Your Object or parameter"),
                    beforeSend: function (xhr, opts) {
                    },
                    contentType: 'application/json; charset=utf-8',
                    complete: function () { },
                    success: function (data) {
                        $form.html(data);
                        $form.removeData('validator');
                        $form.removeData('unobtrusiveValidation');
                        $.validator.unobtrusive.parse($form);
                    }
                });
            }
            return false;
        });
    });
    return false;
});

视图

<div id="formContainer" data-url="@Url.Action("ActionName", "ControllerName", 
                                             new { area = "Area Name" })"></div>
<input id="BTN" type="button" value="Button" />

模型

public class SampleModule
{
    [Required]
    public String MyName { get; set; }
}

局部视图

@using (Html.BeginForm("Action Name", "Controller Name", FormMethod.Post, 
                       new { id = "myForm" }))
{
    @Html.LabelFor(i => i.MyName)
    @Html.TextBoxFor(i => i.MyName)
    @Html.ValidationMessageFor(i => i.MyName)
    <p id="getDateTimeString"></p>
   <input type="button" value="Button" />        
}

参考资料

<script src="/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js" type="text/javascript">
</script>

Pankaj,感谢您的解答。这些更改都应该是部分视图,对吗? - DotNetBeginner
什么是 var $form = $('#myForm'); 其中id为myform的表单? - DotNetBeginner
我对mvc不太了解,所以请原谅我的问题可能不够聪明。这个部分视图看起来会像这样:@using (Html.BeginForm("Action Name", "Controller Name", FormMethod.Post, new { id = "myForm" })) {<div id="formContainer" data-url="@Url.Action("ActionName", "ControllerName", new { area = "Area Name" })"> @Html.LabelFor(i => i.MyName) @Html.TextBoxFor(i => i.MyName) @Html.ValidationMessageFor(i => i.MyName) <p id="getDateTimeString"></p> <input type="submit" value="Click here" /> </div> } - DotNetBeginner
我已经按照你的要求做了。但是按钮没有响应。 <div id="formContainer" data-url="@Url.Action("ActionName", "ControllerName", new { area = "Area Name" })"></div> 这是你用于对话框的 div。 - DotNetBeginner
尝试了两种方法,都不起作用。如果周末还不行,我会再试一次并留下评论。非常感谢你们的帮助。祝你们周末愉快。 - DotNetBeginner

0

你好,我们可以使用内置的非侵入式功能而不编写任何JavaScript。

模型

    Public class Model{[Required(ErrorMessage = "Required.")]
   [Range(0, int.MaxValue, ErrorMessage = "Please enter a Number")]
   public int NumberOfPosters { get; set; }}

局部视图

    @Html.TextBoxFor(model => model.NumberOfPosters, new { style="width:150px;"})
     @Html.ValidationMessageFor(model => model.NumberOfPosters)

Example Imge


如果您的添加按钮使用默认的提交操作进行回发,那么这将无法正常工作。 - Emil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接