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