我有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属性并允许直接请求查看? 这个问题有哪些替代方案?
答案 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)