【问题标题】:Partial View With ChildActionOnly Attribute issue带有 ChildActionOnly 属性问题的部分视图
【发布时间】:2011-09-17 09:00:55
【问题描述】:

我有 jquery 呈现的部分视图,我想使用 jquery 刷新视图。这是我的代码的样子。

<div id="left">
<input type="button" id="refresh" value="refresh" />
    @Html.Partial("_LeftColumn", new ColumnViewModel { Attempt= DateTime.Now })
</div>

<script type="text/javascript">
    $('#refresh').click(function () {
        $.ajax({
            type: "post",
            dataType: "html",
            url: 'Home/LeftColumnData',
            data: {},
            success: function (response) {
                $('#left').html(response);
            }
        });
    });
</script>

在控制器动作中我这样写

[ChildActionOnly]
public PartialViewResult LeftColumnData()
{
    var Column= new ColumnViewModel { Attempt= DateTime.Now };
    return PartialView("_LeftColumn", Column);
}

我不希望用户直接从浏览器请求 ColumnData,但通过 ajax 除外,但使用这种方法我会收到以下错误。

我应该怎么做才能删除 ChildActionOnly 属性并允许直接请求视图? 这个问题的替代方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc-3 jquery


    【解决方案1】:

    你可以使用AjaxOnly

    [AjaxOnly]
    [HttpPost]
    public ActionResult LeftColumnData()
    {
        var Column= new ColumnViewModel { Attempt= DateTime.Now };
        return PartialView("_LeftColumn", Column);
    }
    

    这是你如何制作一个

    public class AjaxOnlyAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if(!filterContext.HttpContext.Request.IsAjaxRequest())
                filterContext.HttpContext.Response.Redirect("/error/404");
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
    
        }
    }
    

    并像使用它一样

    [AjaxOnly]
    public ActionResult AjaxActionMethod()
    {
        ....
    }
    

    【讨论】:

    • AjaxOnly 在哪个命名空间下?
    【解决方案2】:

    如果您打算直接访问此操作,则需要删除 [ChildActionOnly] 属性:

    public PartialViewResult LeftColumnData()
    {
        var Column = new ColumnViewModel { Attempt = DateTime.Now };
        return PartialView("_LeftColumn", Column);
    }
    

    此外,据我所知,您无法将此操作用作子操作。你所做的只是渲染一些局部:

    @Html.Partial("_LeftColumn", new ColumnViewModel { Attempt= DateTime.Now })
    

    这不会调用您的子操作。它只是在给定位置插入_LeftColumn.cshtml 部分。

    使用 Html.Action 或 Html.RenderAction 助手调用子操作:

    @Html.Action("LeftColumnData")
    

    但是因为您希望该操作也可以通过 AJAX 调用访问,所以您应该删除 ChildActionOnly 属性。

    您可以在following blog post 上阅读有关 RenderPartial 和 RenderAction 之间差异的更多信息。

    【讨论】:

      【解决方案3】:

      ASP.NET MVC 3 Futures 集合中提供了一个 [AjaxOnly] 属性。它是官方 ASP.NET MVC Codeplex 网站的一部分,在正式包含在未来版本的 ASP.NET MVC 之前提供功能。

      您可以下载它here。要使用它,请添加对发布包中包含的 Microsoft.Web.Mvc 程序集的引用。

      this页面上有属性说明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-04
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多