如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作
Posted
技术标签:
【中文标题】如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作【英文标题】:How to call MVC ChildActionOnly Controller Action using jQuery 【发布时间】:2014-08-18 01:46:56 【问题描述】:我有一个位于部分视图中的 DropDownListFor。更改时会触发 jQuery 脚本,但 Fiddler 显示 HTTP 500 错误:
The action 'LanguageListPartial' is accessible only by a child request.
调用脚本:
<script type="text/javascript">
$(function ()
$('#SelectedLanguage').on('change', function ()
var culture = $(this).val();
$('#test').load("/Account/LanguageListPartial/" + culture, function ()
location.reload(true);
);
);
);
</script>
我不希望直接调用控制器动作,所以它用[ChildActionOnly]
装饰。我意识到它是直接用 jQuery .load()
调用的。
有没有办法保持ChildActionOnly
限制并仍然通过.on('change' ...)
事件从jQuery 调用它?
【问题讨论】:
没有分配属性的方法 【参考方案1】:首先:创建一个同时支持 ChildActionOnly 和 Ajax 功能的自定义属性:
public class AjaxChildActionOnlyAttribute : ActionMethodSelectorAttribute
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest() || controllerContext.IsChildAction;
然后:为部分视图使用上面创建的属性:
[AjaxChildActionOnly]
public PartialViewResult LanguageListPartial(string id)
//Function Logic
【讨论】:
【参考方案2】:不,你不能那样做。 ChildActionOnly
属性的全部意义在于防止它因用户请求而被调用。
【讨论】:
我接受你的回答令人失望。我想有人点击该 URL 并没有什么坏处。我相信它只会为他们显示一个下拉列表。有什么方法可以在控制器动作中检测到它是从 jQuery 调用的吗?我的意思是,我看到有一个Request.IsAjaxRequest
布尔值,但 .load() 不是 Ajax。也许我应该重写 jQuery 以使用 Ajax 并检查该布尔值。这样就解决了?
如果您确实使用 AJAX,那么您可以按照 this answer 使用 AjaxOnly 属性来装饰您的操作方法
部分视图也用于其他视图页面,这些页面不会使用 AJAX(或 jQuery)调用它。以上是关于如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jQuery 和 ASP.NET MVC 从 AJAX 调用返回错误消息?
如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件
在 MVC 中如何通过 jquery 调用 .ashx 处理程序文件
如何以 10 秒的间隔在 mvc razor 页面中使用 jQuery 调用方法并将输出附加到 html