0

私は MVC4 サイトで多くの Json.NET を使用しており、JsonNetResult クラスで FUNC を使用して少し単純化しようとしました。JsonNetResult コントローラー アクションを作成しているときに、すべてを同じ try/catch ステートメントでラップしていたことがわかりました。そのため、入力として Func を受け取るメソッドを JsonNetResult クラスに作成しました。ただし、入力としてのオブジェクトが機能しないことがわかりました。具体的に説明する必要があり、Func<>.

この場合、オブジェクトを入力として使用する方法はありますか? 私がやろうとしていることを行うためのより良い方法はありますか? DRY に準拠しようとしていますが、FUNC<> を活用してそれを正しく行う方法がわかりません。助けや指針をいただければ幸いです。

コントローラーからのコード:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonNetResult jsonUpdateProfile(UserProfile u)
    {
        JsonNetResult j = new JsonNetResult();
        var x = ModelState;
        Func<UserProfile, jsonResponseObj> updater = p => updateUserProfile(p);
        j.GetResponseObj(updater, u);

        return j;
    }

    private jsonResponseObj updateUserProfile(UserProfile u)
    {   
        UserProfile updateUser = db.UserProfiles.Find(u.UserId);
        updateUser = u;
        updateUser.UpdatedBy = u.UserName;
        updateUser.UpdatedOn = DateTime.Now;
        db.SaveChanges();
        return new jsonResponseObj(null,"Profile Updated");
    }

JsonNetResult からのコード: ActionResult

public void GetResponseObj(Func<object, jsonResponseObj> custom, object arg)
{
    try
    {
        Data = custom.Invoke(arg);
    }
    catch (Exception ex)
    {
        // alert elmah
        Data = new jsonResponseObj(ex);
    }
}

このjsonResponseObjクラスは、すべての応答を標準化するための JSON データの単なるラッパーです。

public class jsonResponseObj
{
    public string status { get; set; }
    public Object data { get; set; }
    public string msg { get; set; }

    public jsonResponseObj(Object data, string msg = "")
    {
        this.status = "OK";
        this.data = data;
        this.msg = msg;
    }

    public jsonResponseObj(Exception ex)
    {
        this.status = "ERROR";
        this.msg = ex.Message;
    }
}
4

1 に答える 1

1

GetResponseObjメソッドをジェネリックに変更する必要があります。

    public void GetResponseObj<T>(Func<T, jsonResponseObj> custom, T arg) where T:class
    {
        try
        {
            Data = custom(arg);
        }
        catch (Exception ex)
        {
            // alert elmah
            Data = new jsonResponseObj(ex);
        }
    }

ActionFilterしかし、例外をキャッチするために追加する方が良い解決策になるかもしれません:

public class ExceptionToJsonNetResultAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
            return;

        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            return;

        if (filterContext.Result is JsonNetResult)
            return;

        ProcessException(filterContext);
    }

    private static void ProcessException(ExceptionContext filterContext)
    {
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new jsonResponseObj(filterContext.Exception);                
        };
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}

これで、アクションをこの属性で装飾し、try/catch ブロックをオフにすることができます。

于 2013-06-02T16:40:41.350 に答える