2013-06-02 38 views
0

我在MVC4網站中使用了很多Json.NET,並試圖通過在JsonNetResult類中使用FUNC來簡化一些事情。我發現在編寫JsonNetResult控制器操作時,我將所有內容都包裝在同一個try/catch語句中,因此我在JsonNetResult類中創建了一個方法,將Func作爲輸入。但是,我發現該對象作爲輸入不起作用 - 我必須具體說明,並且我已經制定了一系列以不同類型作爲Func<>中的參數的重載方法。將FUNC <>傳遞給我在MVC4中的jsonResponseObj類

在這種情況下有沒有辦法使用一個對象作爲輸入?有沒有更好的方式來做我想做的事情?我試圖堅持幹,但我無法弄清楚如何正確使用FUNC <>。我感謝任何幫助或指點。從控制器

代碼:從JsonNetResult

[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"); 
    } 

代碼: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; 
    } 
} 

回答

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塊了。

+0

謝謝@Kirill,今天我會試試這個! – user576838

+0

另外,@Kirill Bestemyanov - 聲明_errorHandlingService屬性在哪裏?我也沒有把它看作ProcessException方法中的一個參數。這個應該實現IActionFilter嗎? – user576838

+0

這是不需要的。你應該從聲明中刪除它。我更新答案。 –

相關問題