部分视图与ChildActionOnly属性问题

时间:2011-09-17 09:00:56

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

我有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,但是使用这种方法我得到以下错误。

enter image description here

如何删除ChildActionOnly属性并允许直接请求查看? 这个问题有哪些替代方案?

3 个答案:

答案 0 :(得分:15)

您可以使用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()
{
    ....
}

答案 1 :(得分:5)

如果您打算直接访问此操作,则需要删除[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之间的差异。

答案 2 :(得分:1)

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

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

this页面上有关于该属性的说明。