コントローラに移動する代わりにコードエラーを返すことについては、カスタムRouteHandlerを実装する必要があります。このリンクは、指を置くことができるすべてのものを再開します...そして、この方法で変更することができます。リターンタイプの「適応」について...これはコントローラーで行うことができます。Json(...)を返す場合と、ViewまたはPartialViewを返す場合は、somを入れるだけで十分です。
ただし、コントローラーフィルターでこれを行うのは良いことです...!
コントローラーがクライアントとリターンタイプをネゴシエートできるようにするコントロールフィルターを実装しました。私は非常に単純です...クライアントは、ルートパラメータ(URLの一部またはクエリ文字列)で、またはこの情報を含むフィールドを投稿することによって、受信したいタイプを宣言するだけです。使用法は非常に簡単です...クライアントから情報がない場合、rcontrollerは「デフォルト」の戻りタイプでビューを返すことができます。次に、フィルターは、ビューが呼び出される前に結果タイプを自動的に「変更」し、クライアントが必要とするものに変換します。フィルタによって処理される可能性は、クライアントまたはJsonによって名前が選択されたビューです。
コードはここにあります(悪意のあるユーザーによる攻撃を防ぐためにクライアントによって提供される「ヒント」に対するいくつかのコントロールが含まれています):
public class AcceptViewHintAttribute : ActionFilterAttribute
{
private JsonRequestBehavior jsBehavior;
public AcceptViewHintAttribute(JsonRequestBehavior jsBehavior = JsonRequestBehavior.DenyGet)
{
this.jsBehavior = jsBehavior;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
string hint = filterContext.RequestContext.HttpContext.Request.Params["ViewHint"];
if (hint == null) hint = filterContext.RequestContext.RouteData.Values["ViewHint"] as string;
if (!string.IsNullOrWhiteSpace(hint) && hint.Length<=100 && new Regex(@"^\w+$").IsMatch(hint) )
{
ViewResultBase res = filterContext.Result as ViewResultBase;
if (res != null)
{
if (hint == "json")
{
JsonResult jr = new JsonResult();
jr.Data = res.ViewData.Model;
jr.JsonRequestBehavior = jsBehavior;
filterContext.Result = jr;
}
else
{
res.ViewName = hint;
}
}
}
base.OnActionExecuted(filterContext);
}
}