防止部分视图加载

5
2个回答

8
如果您通过Ajax加载您的部分,则可以检查请求HTTP标头HTTP_X_REQUESTED_WITH是否存在,其值等于XMLHttpRequest
当通过浏览器发出请求时,该标头不存在。
这是一个非常简单的Action Filter属性实现,可以为您完成此任务。
public class CheckAjaxRequestAttribute : ActionFilterAttribute
{
    private const string AJAX_HEADER = "X-Requested-With";

    public override void OnActionExecuting( ActionExecutingContext filterContext ) {
        bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null;
        if ( !isAjaxRequest ) {
            filterContext.Result = new ViewResult { ViewName = "Unauthorized" };
        }
    }
}

您可以在任何需要检查请求是否为ajax请求的操作中使用它进行装饰。
[HttpGet]
[CheckAjaxRequest]
public virtual ActionResult ListCustomers() {
}

没事了,我找到了。Request.Headers.Get("X-Requested-With") ;o) - Martin Overgaard
请查看我的答案编辑以获取实现细节 :) - Lorenzo

5
我相信[ChildActionOnly]属性就是你要找的。
[ChildActionOnly]
public ActionResult Edit( int? id )
{
   var item = _service.GetItem(id ?? 0);
   return PartialView( new EditModel(item) )
}

Phil Haack有一篇文章在这里使用它


我相信它能够完成它应该做的事情,但是当我使用ajax调用来获取部分视图时,它就无法工作了。 - Martin Overgaard
ChildActionOnly并不能阻止使用Ajax请求:“任何标记为ChildActionOnlyAttribute的方法只能通过Action或RenderAction HTML扩展方法调用。”。请参阅http://msdn.microsoft.com/en-us/library/system.web.mvc.childactiononlyattribute(v=vs.118).aspx。 - RolandoCC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接