Частичное представление с проблемой атрибута ChildActionOnly - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть частичное представление, представленное 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 ]

15 голосов
/ 17 сентября 2011

вы можете использовать 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()
{
    ....
}
5 голосов
/ 17 сентября 2011

Если вы намереваетесь получить доступ к этому действию напрямую, вам нужно удалить атрибут [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.

Подробнее о различиях между RenderPartial и RenderAction можно прочитать в следующем сообщении в блоге .

1 голос
/ 18 января 2012

В коллекции ASP.NET MVC 3 Futures имеется атрибут [AjaxOnly] . Это часть официального сайта ASP.NET MVC Codeplex , которая предоставляет функции до их официального включения в будущую версию ASP.NET MVC.

Вы можете скачать его здесь . Чтобы использовать его, добавьте ссылку на сборку Microsoft.Web.Mvc , входящую в комплект поставки.

На этой странице есть объяснение атрибута .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...