部分视图与ChildActionOnly属性问题

Gay*_*yan 3 c# jquery asp.net-mvc-3

我有部分视图由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>
Run Code Online (Sandbox Code Playgroud)

在控制器动作中,我这样写了

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

我不希望用户直接从浏览器请求ColumnData,除非通过ajax,但是这种方法我得到下面的错误.

在此输入图像描述

我该怎么做才能删除ChildActionOnly属性并允许直接请求查看?这个问题有哪些替代方案?

Raf*_*fay 15

您可以使用 AjaxOnly

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

这是你如何制作一个

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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它

[AjaxOnly]
public ActionResult AjaxActionMethod()
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

  • 完全不完整的答案-1 (2认同)

Dar*_*rov 5

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

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

同样从我所看到的,你无处使用这个动作作为一个儿童行动.你要做的只是渲染一些部分:

@Html.Partial("_LeftColumn", new ColumnViewModel { Attempt= DateTime.Now })
Run Code Online (Sandbox Code Playgroud)

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

使用Html.Action或Html.RenderAction帮助程序调用子操作:

@Html.Action("LeftColumnData")
Run Code Online (Sandbox Code Playgroud)

但是因为您希望从AJAX调用中访问此操作,所以应该删除ChildActionOnly属性.

您可以在以下博客文章中阅读有关RenderPartial和RenderAction之间差异的更多信息.