ModelState和对话框

时间:2012-09-06 11:45:01

标签: jquery asp.net-mvc-3 razor modelstate

我有一个使用实体foo的对话框。
保存此对话框中的值后,我执行以下操作:

    $('#SaveEditPQ').submit(); //jquery submit
    $("#NewQuickDlg.results").remove();  // clear the fields within the dialog Box
    $("#AddQuickDlg").dialog("close");   // close the dialog box.


现在......当我尝试使用(元数据)验证时,问题出现了。如果ModelState.IsValid为假,我想保持对话框打开。

这可以通过扩展我的foo实体来获得ModelState.IsValid的值并将我的Jquery更改为:

,从而非优雅地解决这个问题。
$('#SaveEditPQ').submit(); 
    if ('@Model.IsValidVariable'==true)
    {
    $("#NewQuickDlg.results").remove(); 
    $("#AddQuickDlg").dialog("close");  
    }

这是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

我正在努力解决同样的问题,但我以不同的方式解决了这个问题。我不想用隐藏变量污染我的模型来关闭对话框,所以我所做的是重定向到共享的_close partialview。然后在我的帖子后,检查是否存在关闭div并关闭对话框。所以我的查询看起来像

$(document).on('click', "#SaveButton", function () {
    $.ajax({
        url: "/controller/Edit",
        type: "POST",
        data: $("form").serialize(),
        error: function (data) {
            var errorMessage = $.parseJSON(data.responseText);
        },
        success: function (data) {
            if (data) {
                if ($(data).attr('id') == 'close') {
                    $("#myDialog").dialog('close');
                }
                $("#myDialog").html(data);
                $("form :input:visible:enabled:first").focus();
            }
            else {
                $("#myDialog").html('no data');
            }
            return false;
        }
    });

现在我在对话框中看到了服务器端验证。

这是控制器方法

    [HttpPost]
    public ActionResult SaveEdit(SomeType viewModel)
    {
        if (!ModelState.IsValid)
        {
            PopulateDropDowns(viewModel);

            return PartialView(viewModel);
        }

        var someObject= _objectRepository.Get(viewModel.Id);

        //make some changes to someObject

        _objectRepository.Save(someObject);

        return PartialView("_close");
    }

所以这也遵循PRG模式