코드가 동일 할 때 왜 2 개의 별도 동작을 사용합니까? 다른 결과입니다.
대해 어떻게 : 당신은 모든 컨트롤러 액션에서이 작업을 수행해야한다면
public ActionResult List()
{
var model = ...
if (Request.IsAjaxRequest())
{
return View(model);
}
return Json(model);
}
분명히 이것은 신속하게 완전한 악몽이 될 것입니다.
[MyFilter]
public ActionResult List()
{
var model = ...
return View(model);
}
사용자가 정의 할 수 있습니다 어디 MyFilterAttribute
과 같이 :
그래서 당신은 사용자 지정 작업 필터에이 논리를 구체화 할 수
public class MyFilterAttribute: ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var result = filterContext.Result as ViewResultBase;
if (result != null)
{
filterContext.Result = new JsonResult
{
Data = result.Model,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
}
}
또한 글로벌 작업으로이 작업 필터를 등록 할 수 있습니다 필터를 필요로하는 각 컨트롤러 및 작업에 넣지 않아도됩니다.
UPDATE :
바와 같이 코멘트 섹션에서 설명 IT는 영업 이익은 2 개 개의 다른 작업이 필요한 것으로 보인다.
public class MyRoute : Route
{
public MyRoute(string url, object defaults) :
base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
if (rd == null)
{
return null;
}
if (httpContext.Request.IsAjaxRequest())
{
rd.Values["action"] = rd.GetRequiredString("action") + "json";
}
return rd;
}
}
Application_Start
에 등록됩니다 :
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(
"Default",
new MyRoute(
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
)
);
}
코드가 동일하지 않을 수 있습니다. 실행 된 쿼리 및 필요한 데이터가 크게 다를 수 있습니다. 테스트 가능성의 관점에서 볼 때, 두 가지 방법을 사용하는 것이 훨씬 깔끔하고, 요청을 기반으로 두 가지 방법을 사용하는 것이 좋습니다. –
@JosephDaigle, 내 업데이트 참조. –
그것은 영리한 생각입니다. 그러나 "action"값을 조작하고 있으므로 아웃 바운드 URL 생성에 어떤 영향을 미치는지 궁금합니다. –