Tôi muốn có thể đánh dấu một hành động trên bộ điều khiển được gọi là cả từ các cuộc gọi ajax và qua RenderAction. Vấn đề là cả hai thuộc tính này lấy được hoặc thực hiện các trừu tượng khác nhau. Một đường ra là tiếp theo:Kết hợp AjaxOnlyAttribute và ChildActionOnlyAttribute vào một bộ lọc hành động
[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }
Nhưng điều này không hề gọn gàng chút nào.
Các AjaxOnly thuộc tính tôi đang nói về là:
public sealed class AjaxOnlyAttribute : ActionFilterAttribute
{
#region Public members
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
filterContext.Result = new HttpNotFoundResult();
}
#endregion
}
Phương pháp này được lấy từ MVC3 tương lai. Một bình luận quan trọng tại sao tình trạng này không được filterContext.HttpContext.Request.IsAjaxRequest()
được thực hiện bởi nhóm phát triển và cho biết như sau:
// Dev10 #939671 - If this attribute is going to say AJAX *only*, then we need to check the header
// specifically, as otherwise clients can modify the form or query string to contain the name/value
// pair we're looking for.
Tại sao? Giả sử hành động của bạn được tái sử dụng từ các vị trí khác nhau thông qua các yêu cầu RenderAction() và ajax. Giả sử chúng được tái sử dụng trên các trang khác nhau như smth vẽ một số bảng công cụ tiêu chuẩn cho nhiều nơi và được sử dụng hơi khác nhau trong các ngữ cảnh khác nhau –
@Hohhi, vì vậy bạn muốn hành động của mình chỉ có thể truy cập được thông qua cuộc gọi AJAX hoặc dưới dạng Hành động con ? –
Chính xác, Cảm ơn bạn đã đề xuất, tôi sẽ cập nhật câu hỏi và cho biết tôi nhận được bao lâu trong một khoảng thời gian –