mvc视图插入错误的“DOM”telerik窗口

时间:2012-02-06 00:37:11

标签: asp.net-mvc-3 razor telerik

如果这成为一个很长的问题,请提前道歉......

背景资讯

我有一个使用Telerik组件的MVC 3应用程序,这个特定的问题(我认为)特定于Window()组件。

从我的主视图(Index.cshtml)我执行ajax请求以返回部分视图,这是我用我的窗口内容填充的。这是执行请求的jquery:

var url = '@Url.Action("GetAddPart", "Jobs")';            
var window = $("#Window").data("tWindow");
var data = $("#indexForm").serialize();
window.ajaxRequest(url, data);
window.center().open();

控制器操作是:

[HttpGet]
public ActionResult GetAddPart(MDTCompletedJobM model)
{
    // show the AddPart window

    //TryUpdateModel<MDTCompletedJobM>(model);
    model.ActionTakenList = ActionTakenList;
    model.ProblemTypes = ActualProblemList;
    var addPartM = new MDTAddPartM() { CompletedJobM = model };
    return PartialView(string.Concat(ViewDefaultUrl, "AddPart.cshtml"), addPartM);
}

这打开了我的窗户hunky dory。

在我的局部视图中,我有一个带有两个或三个字段的表单和一个“添加”,“取消”按钮。为了简洁起见,我只是展示我认为是部分视图的相关部分,但是我如果需要,可以生成整个视图:

<div id="resultDiv">
    @using (Html.BeginForm("AddPart", "Jobs", FormMethod.Post, new { id = "addPartForm", name = "addPartForm" }))
    { 

             ** layout components removed from here **

        <input type="button" value="Add" class="t-button" id="btnAdd"/>
        <input type="button" value="Cancel" class="t-button" id="btnCancel"/>

        <p />
        <div id="progressdiv">
        </div>

    }    
</div>

是局部视图中的“顶级”标记。

我的jquery处理取消按钮是:

$("#btnCancel").click(function () {
    var window = $("#Window").data("tWindow");
    window.close();
});

在我的主视图中,我有一个提交按钮,在完成后有效地将主视图“禁用”或显示错误。此提交按钮的操作将返回主视图:

Controller's action snippet:
            if (ViewData["DoPayJobWarningStr"] == null)
                return RedirectToAction("GetAutoDispatchJob", new { autoDispatchJob = model.JobReferenceNumber});
            else
                return View(string.Concat(ViewDefaultUrl, "Index.cshtml"), tmpModel);

我的实际问题

对于我正在使用的特定示例,我期望ViewData [“DoPayJobWarningStr”]不为null,返回View(...)将被执行。

如果我在不打开窗口的情况下执行此操作(对于提交按钮),我的视图将正确返回并更新页面以显示警告消息。但是,如果我先打开窗口然后执行提交按钮,页面上的View不会更新,但似乎放在了Window的html中。即,如果我点击提交按钮(没有任何反应),然后单击打开Telerik窗口的按钮,我会简要地看到提交动作返回的视图,在更新部分视图应包含的内容之前显示。我完全不了解退回的View放在那里的原因是什么或为何?

我尝试过的事情:

  1. 注释掉ajax请求(window.ajaxRequest(url,data);)修复了问题(即使我显然有一个空白的局部视图来查看)。
  2. 不将“部分视图”视为“表单”不起作用
  3. 无论我如何“关闭”窗口,视图仍然放在那里。例如,单击右上角的x
  4. 使用Firebug,点击提交按钮后的HTML不会更新。
  5. 我没有使用“window.ajaxRequest(url,data)”,而是尝试了(结果相同):

    $.ajax({
        type: "GET",
        cache: false,
        url: url,
        data: $("#indexForm").serialize(),
        success: function (data) {
            var window = $("#Window").data("tWindow");
            window.content(data);
            window.center().open();
            $("#progress").html('')
        },
        error: function (e) {
            alert(e.Message);
        }
    });
    
  6. 是否有可能确定我做错了什么?是ajax请求吗?只是假设因为删除它可以解决问题,但可能还有更多问题。

    谢谢,当然如果您需要更多信息,请询问:)

    由于

    修改

    根据3nigma的建议,这是我更新的内容(仍然没有运气)......

    Telerik窗口定义:

    @{Html.Telerik().Window()
        .Name("Window")
        .Title("Add Part")
        .Draggable(true)
        .Modal(true)
        .Width(400)
        .Visible(false)
        .Height(270)
        .ClientEvents(e => e.OnOpen("onWindowOpen"))
        .Render();
    }
    

    jquery函数,它是按钮的OnClick事件:

    function AddBtnClicked() {
        $("#Window").data('tWindow').center().open();
    }
    

    onWindowOpen事件:

    function onWindowOpen(e) {
        //e.preventDefault();
    
        var data = @Html.Raw(Json.Encode(Model));
        var d2 = $.toJSON(data);
    
        $.ajax({
            type: 'GET',
            url: '@Url.Action("GetAddPart", "Jobs")',
            data: d2,
            contentType: 'application/json',
            success: function (data) {
                var window = $("#Window").data("tWindow");
                window.content(data);
                $("#progress").html('');
            },
            error: function (xhtr, e, e2) {
                alert(e +'\n' + xhtr.responseText);
            }
        });
    };
    

1 个答案:

答案 0 :(得分:0)

行。

问题与部分视图中的这一行有关:

<script src="@Url.Content("~/Scripts/ValidationJScript.js")" type="text/javascript"></script>

一旦我把它拿出来,一切正常。不知道为什么会导致这个问题 - 我不认为它曾经被加载过,但也许它导致了这个问题。

感谢3nigma的想法,尽管如此!