【问题标题】:How to call MVC ChildActionOnly Controller Action using jQuery如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作
【发布时间】: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 调用它?

【问题讨论】:

  • 没有分配属性的方法

标签: jquery asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案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)调用它。
    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多