ASP.NET MVC3 Ajax:InsertionMode.Replace无法按预期工作

时间:2011-12-23 18:15:11

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

我是MVC的新手,喜欢它,但遇到了一个问题。我有一个像这样的代码的视图:

@model MyModel

@Ajax.ActionLink("Add", "Create", "User", null, 
    new AjaxOptions { 
        UpdateTargetId = "mydiv", 
        InsertionMode = InsertionMode.Replace, 
        HttpMethod = "GET"
    }, 
    new {
        @class = "add"
    })

<div>
    @Html.Partial("UserTable", Model.RegisteredUsers)
</div>

<div id="mydiv" />

这可能非常明显,但页面显示了一个用户列表(“UserTable”部分视图),并包含管理员单击以创建新用户的链接。创建用户表单是一个局部视图,其作用类似于UserTable上的弹出窗口。这是返回创建用户表单的控制器操作:

public string Create()
{
    Models.User user = new Models.User();
    PartialViewResult vr;
    ViewContext vc;
    StringWriter sw = new StringWriter();

    vr = PartialView("../../Views/User/UserForm", user);
    vr.ExecuteResult(this.ControllerContext);
    vc = new ViewContext(this.ControllerContext, vr.View, vr.ViewData, new TempDataDictionary(), sw);
    vr.View.Render(vc sw);

    return "<div style=\"position:absolute; top:200px; left:175px\">" + sw.ToString() + "</div>";
}

我返回字符串而不是ActionResult(或类似的东西)的原因是添加创建“弹出”效果的包装div。这一切都完美无缺,除了在“弹出窗口”中显示之外,创建用户表单也显示在UserTable下面,其中“mydiv”是。对页面源的检查显示“mydiv”没有被替换,而是创建用户表单的代码被放置在新弹出div中的div 中,并且我'我没有运气搞清楚原因。

我想我正在引用正确的jQuery库:

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

有谁能告诉我为什么我会得到这种行为以及如何解决这个问题?或者是否有更好的方法来达到你可以推荐的相同效果?

TIA!

杰夫

修改

哦,忘了提一下:我不能在创建用户表单中放置“popup”div的原因是它在系统的其他地方使用,并且那种行为在那里是不可取的。我自己没有创建该表单,只是在我的场景中重用另一个开发代码。

1 个答案:

答案 0 :(得分:1)

我想我想出来了。我误解了控制器操作中的Render方法正在做什么。它应该是显而易见的,但它实际上将局部视图写入页面。它再次被写入,这次是“弹出”div,当动作返回时。

我找到了另一种方法来处理这个问题。正如我所提到的,我无法直接修改创建用户表单,但我创建了另一个局部视图,并通过@Html.Partial向其添加了创建用户表单,所有这些都包含在弹出窗口中。然后,我所要做的就是从控制器动作返回这个“派生”的局部视图,它就像一个魅力。

无论如何,只是想我发布这个以防任何人发现自己处于类似情况。

杰夫