2011-12-19 207 views
3

我想完全瞭解我如何簡化如下:將參數傳遞給Action?

public ActionResult Create(string ds) { 
      InitializeServices(ds, "0000"); 
      vm.Account = new Account { 
        PartitionKey = "0000", 
        RowKey = "0000", 
        Created = DateTime.Now, 
        CreatedBy = User.Identity.Name 
      }; 
     } 
     catch (ServiceException ex) { 
      ModelState.Merge(ex.Errors); 
     } 
     catch (Exception e) { 
      Trace.Write(e); 
      ModelState.AddModelError("", "Database access error: " + e.Message); 
     } 
     return View("CreateEdit", vm); 
    } 

我有幾個偉大的答案和以下建議:

private void HandleException(Action action) { 
     try { 
      action(); 
     } 
     catch (ServiceException ex) { 
      ModelState.Merge(ex.Errors); 
     } 
     catch (Exception e) 
     { 
      Trace.Write(e); 
      ModelState.AddModelError("", "Database access error: " + e.Message); 
     } 
    } 

    RunAndHandleExceptions(new Action(() =>     
    {      
     //Do some computing     } 
    )); 

這看起來像一個真正偉大的解決方案,但我仍然不明白如何將我的 參數傳遞到動作中。我需要做的是在下面的經過:

 string ds 
    System.Web.Mvc.ModelState ModelState (passed as a reference) 
+2

請注意,捕獲每個異常是一種糟糕的編程習慣。有人調用堆棧可能已經能夠處理該異常。 – 2011-12-19 16:29:39

回答

2

只是

HandleException(() => someFunction(ds, ModeState)); 

應該這樣做

要得到返回值,你需要一個Func<>,不Action<>

private TR HandleException<TR>(Func<TR> action) 
{ 
    try 
    { 
     return action(); 
    } 
    catch (ServiceException ex) 
    { 
     ModelState.Merge(ex.Errors); 
    } 
    catch (Exception e) 
    { 
     Trace.Write(e); 
     ModelState.AddModelError("", "Database access error: " + e.Message); 
    } 

    return default(TR); // null for reference types 
} 

然後你會使用它,例如沒有一個現有的功能:

bool result = HandleException(() => 
    { 
     if (string.IsNullOrEmpty(ds)) 
      return false; 

     // do interesting stuff that throws many kinds of exceptions :) 
     // Note: freely use ds and ModelState from surrounding scope, 
     // no need to 'pass them' 

     return true; 
    }); 
+0

我看到你正在使用「someFunction」。如果它是一個匿名函數,我該如何編碼?我一直在試圖做到這一點,但不斷收到許多語法錯誤。 – 2011-12-19 16:45:24

+0

@SamanthaJ:添加了一個示例,添加我的答案的底部 – sehe 2011-12-19 18:16:07

+0

並修復它(請參閱評論) – sehe 2011-12-19 23:27:00

0

可以與多達16個參數定義了一個動作(不討論,如果這個數字是非常有用的,請)。所以,酸味的呼叫可能看起來像:

private void HandleException(Action<string, System.Web.Mvc.ModelState ModelState > action) { 

編輯

這裏是一個具有參數作用的例子:

private void RunHandleException(Action<int> action) 
{ 
    action(someIntValue); 
} 

... 

RunAndHandleExceptions((someInt) => 
    {  
     //Do some computing  
    }); 

這裏是與具有回報功能的例子值:

private void RunHandleException(Func<bool, int> action) 
{ 
    bool returnValue = action(someIntValue); 
} 

... 

RunAndHandleExceptions((someInt) => 
    {  
     //Do some computing 
     return true;  
    }); 
+0

請您澄清您的意思。我仍然感到困惑:-( – 2011-12-19 17:32:51

+0

@SamanthaJ:我已經改變了我的答案,並向您展示了一些示例代碼。 – Fischermaen 2011-12-19 18:01:10

0

你看過RedirectT oAction?

return this.RedirectToAction(c => c.SomeAction(MyParam)); 
+0

我添加了mvc標籤,使其不那麼奇怪:) – sehe 2011-12-19 15:22:30