(注意:在原始帖子后更新 - 在底部解决方案)
问题:
我正在使用MVC3并使用Ajax.BeginForm创建了Telerik ComboBox的局部视图,然后我尝试使用附加到ComboBox的javascript处理程序作为客户端事件来提交它。
但是,无论何时提交并获取Controller,Request.IsAjaxRequest()都返回false,因此不会将其视为ajax请求。如果我添加一个单独的提交按钮并使用它提交表单然后在Controller中,Request.IsAjaxRequest()返回true。
目前的结果是我的PartialView作为整页返回,而不是替换必要的div。参考下面的源代码,它是从Controller返回的BUserControl,但是作为整页。
我也尝试使用非Telerik DropDownList并获得相同的结果。
如果有人能够确定可能出现的问题,我将非常感激。
这是包含部分视图的Razor页面:
@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>
@{
ViewBag.Title = "DEF - View Creation";
}
<div class="editor-label">
@Html.Label("System", "System")
</div>
<div class="editor-field">
@Html.Partial("AUserControl", Model)
</div>
<div class="editor-label">
@Html.Label("Type", "Type")
</div>
<div class="editor-field" id="B">
@Html.Partial("BUserControl", Model)
</div>
这是AUserControl的部分视图
@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>
@using (Ajax.BeginForm("LoadB", "View", new AjaxOptions { UpdateTargetId = "B" }))
{
@(Html.Telerik().ComboBoxFor(m => m.SelectedA)
.BindTo(new SelectList(GetExistingViewData.As, "Id", "DisplayName"))
.HtmlAttributes(new { style = string.Format("width:{0}px", 500) })
.ClientEvents(events => events.OnChange("onSelectedAChange"))
)
}
<script type="text/javascript">
function onSelectedAChange()
{
$(this).parents('form').submit();
}
</script>
这是BUserControl的局部视图(请注意,它引用了一个“C”div,我在这篇文章中为了简洁而故意忘记了Razor页面):
@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>
@using (Ajax.BeginForm("LoadC", "View", new AjaxOptions { UpdateTargetId = "C" }))
{
@(Html.Telerik().ComboBoxFor(m => m.SelectedB)
.BindTo(new SelectList(GetExistingViewData.GetBs(Model.SelectedA), "Id", "DisplayName" ))
.HtmlAttributes(new { style = string.Format("width:{0}px", 500) })
.ClientEvents(events => events.OnChange("onSelectedBChange"))
)
}
<script type="text/javascript">
function onSelectedBChange() {
$(this).parents('form').submit();
}
</script>
最后,这是在AUserControl中的Combo发生变化时调用的Controller函数:
[HttpPost]
public ActionResult LoadBs(ViewModel model)
{
PartialViewResult res = PartialView("BUserControl", model);
return res;
}
在这个Controller函数中,如果我在立即窗口中键入Request.IsAjaxRequest(),则返回false。
我检查过的事情(正如其他地方多次提到的那样):
这些建议就像在similar question
中一样其他细节:
--------现在根据以下解决方案解决了这个问题--------
最后在两天后解决了这个问题 - 回复以便如果其他人遇到同样的问题,那将有助于他们!
在我们的_Layout.cshtml页面中,我们在head部分包含以下行以包含jQuery库:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
但是,因为我们正在使用Telerik MVC控件,所以我们在_Layout.cshtml页面中也有以下行:
@Html.Telerik().ScriptRegistrar();
这会注册Telerik控件的正确javascript包含。
默认情况下,会在页面末尾添加以下内容:
<script src="@Url.Content("~/Scripts/2011.3.1115/jquery-1.6.4.min.js")" type="text/javascript">
这个更新版本的jquery(或两者都包括在内)显然会导致ajax表单提交出现问题,因为我在我的另一个示例项目(完全正常工作)中包含了这一行,然后它就崩溃了。
所以,回到主项目 - 略微改变Telerik脚本注册行将删除默认的jQuery包含,然后一切正常。
@Html.Telerik().ScriptRegistrar().jQuery(false);
Controller现在将提交识别为正确的Ajax回发,部分视图正确返回。