MVC3 Ajax.BeginForm奇怪的行为

时间:2011-03-30 05:26:01

标签: asp.net-mvc-3

我有一个非常简单的视图,在Ajax.BeginForm帮助器中有一个DropDownListFor和一个Button。单击该按钮会在我设置为更新的div中再次呈现整个视图,包括布局页面(我还注意到多次单击按钮时cpu中的峰值)

以下是视图中的Ajax.BeginForm:

@using (Ajax.BeginForm("About2", "Home", new AjaxOptions { UpdateTargetId = "property22" }))
{
    <div>
        <div id="property22">
            @Html.DropDownListFor(m => m.SomePropertyToBind, new SelectList(Model.list, "property1", "property2"))
        </div>
        <button type="submit" id="test">
            Click me</button>
    </div>
}

我出错的任何想法?

如果有人花了几分钟时间来查看它,我上传了整个项目: http://www.sendspace.com/file/siu3r3 1(免费提供商,因此可能会有弹出广告)

由于

4 个答案:

答案 0 :(得分:1)

您正在使用Ajax.BeginForm帮助程序的错误重载。它应该是这样的:

@using (Ajax.BeginForm(
    "About2", 
    "Home", 
    null, 
    new AjaxOptions { UpdateTargetId = "property22" }, 
    new { @id = "refreshe" }
))

注意我传递的额外空值为routeValues参数。同样在您上传的示例中,您忘记包含TestView.cshtml视图。这是为了解决问题,你有两种可能性:

返回部分视图:

public ActionResult About2()
{
    Random randomizer = new Random();
    int random = randomizer.Next(1, 1000000000);
    ModelTest newModelTest = new ModelTest();
    string[] stringList = new string[] { "Red", "Blue", "Green" };
    newModelTest.list = from test in stringList
                        select new ModelTestList
                        {
                            property1 = test,
                            property2 = test
                        };
    newModelTest.SomePropertyToBind = stringList[random % 2];
    return PartialView("TestView", newModelTest);
}

或在TestView.cshtml视图中停用布局:

@{
    Layout = null;
}

答案 1 :(得分:0)

不幸的是,根据您上面的解释和代码,我不确定您要实现的目标。但是,我认为您最担心的是让Ajax在您的视图中工作。

在About2操作方法中,您尝试返回一个完整视图,即TestView(在这种情况下,它不存在)并将newModelTest视图模型传递给它。我建议改变以返回PartialView或JsonResult。

例如,将About2操作方法的return语句更改为

    public ActionResult About2()
    {
        ...
        return Json(newModelTest);
    }

或将其更改为返回类型为字符串并返回“TestResult”

    public String About2()
    {
        ...
        return "TestResult";
    }

或者您可以更改return语句以返回PartialView

答案 2 :(得分:0)

感谢您的回复。

我刚刚意识到About2应该返回“关于”视图而不是“TestView”。我曾尝试使用Ajax.BeginForm代码创建局部视图,但我遇到了同样的问题。

这是我第一次尝试Ajax.BeginForm(到目前为止我一直使用jquery),我的印象是它的工作方式类似于通过指定目标id只有该元素的内容将得到更新,而不是目标实际上将被整个响应对象替换。

感谢您的帮助,我不仅让它工作,而且我现在明白它应该如何运作。

答案 3 :(得分:-1)

我怀疑发生的事情是你在Ajax响应中返回一个完整的View(包括布局模板)。尝试暂时将“Home”控制器“About2”操作更改为以下内容:

public ContentResult About2() {
    return Content("Hello World");
}

我使用您的Razor标记测试了此示例Action并单击该按钮,将您的下拉列表正确替换为“Hello World!”。

如果确实发生了这种情况,那么您将需要在没有布局的情况下从“About2”返回视图,方法是在您返回的视图顶部声明以下内容。

@{
    Layout = null;
}