我有一个非常简单的视图,在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(免费提供商,因此可能会有弹出广告)
由于
答案 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;
}