なぜコードが同じ場合に2つの別々のアクションを使用するのですか?これは異なるビュー結果です。あなたは、すべてのコントローラのアクションでこれをしなければならなかった場合、これはすぐに完全な悪夢になるだろう
public ActionResult List()
{
var model = ...
if (Request.IsAjaxRequest())
{
return View(model);
}
return Json(model);
}
明らかに:どの程度
。
ですから、カスタムアクションフィルタには、このロジックを外部化できます。あなたはまた、世界的なアクションとして、このアクションフィルタを登録することができ
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
};
}
}
}
}
:あなたがそうのようなMyFilterAttribute
を定義することができ
[MyFilter]
public ActionResult List()
{
var model = ...
return View(model);
}
フィルターを使用して、各コントローラーとそれを必要とするアクションに配置する必要がありません。
UPDATE:
としては、コメント欄で説明したが、OPが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 }
)
);
}
コードは同じではない可能性があります。実行されたクエリと必要なデータは大きく異なる可能性があります。テスト容易性の観点からは、2つのメソッドを持つ方がクリーンですが、要求に基づいてそれらの間をルーティングします。 –
@JosephDaigle、私の更新を参照してください。 –
それは巧妙な考えです。しかし、あなたが "アクション"値を操作しているので、それがどのようにアウトバウンドURLの生成に影響するのだろうかと思います。 –