Asp.net mvc 3 MVC3 Ajax.begin异常行为

Asp.net mvc 3 MVC3 Ajax.begin异常行为,asp.net-mvc-3,Asp.net Mvc 3,我有一个非常简单的视图,在Ajax.BeginForm助手中有一个DropDownListFor和一个按钮。单击该按钮将在我设置为更新的div(包括布局页面)内再次呈现整个视图。我还注意到,当多次单击该按钮时,cpu中会出现峰值 以下是视图中的Ajax.BeginForm: @using (Ajax.BeginForm("About2", "Home", new AjaxOptions { UpdateTargetId = "property22" })) { <div>

我有一个非常简单的视图,在Ajax.BeginForm助手中有一个DropDownListFor和一个按钮。单击该按钮将在我设置为更新的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>
}
知道我哪里出错了吗

我上传了整个项目,如果有人有几分钟的时间看一看: 免费提供程序,因此可能会出现弹出窗口


谢谢

我怀疑现在的情况是,您正在返回一个完整的视图,包括Ajax响应中的布局模板。尝试将家庭控制器About2操作临时更改为以下内容:

public ContentResult About2() {
    return Content("Hello World");
}
我用你的Razor标记测试了这个示例操作,点击按钮正确地将你的下拉列表替换为Hello World

如果确实发生了这种情况,那么您将希望通过在要返回的视图顶部声明以下内容,从大约2返回一个没有布局的视图

@{
    Layout = null;
}

您使用了错误的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视图中的布局:


不幸的是,从您上面的解释和代码来看,我不确定您想要实现什么。然而,我认为您最担心的是在您的视图中使用Ajax

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

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

    public ActionResult About2()
    {
        ...
        return Json(newModelTest);
    }
或者将其更改为字符串的返回类型并返回TestResult

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

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

谢谢您的回复

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

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

谢谢你的帮助,我不仅让它工作了,而且我现在明白了它应该如何工作

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