如何使用 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

如何在asp.net mvc中使用jquery ajax在方法中调用字符串

如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?