2011-12-19 17 views
3

私は完全に私は次のように簡略化することができます方法を理解しようとしています:は、アクションにパラメータを渡しますか?

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

注意。コールスタックの誰かがその例外を処理できた可能性があります。 –

答えて

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」を使用している参照してください。それが無名関数であれば、これをどのようにコード化できますか?私はこれをやろうとしてきましたが、多くの構文エラーが続いています。 –

+0

@SamanthaJ:それは私の答え – sehe

+0

そしてそれを固定の下を追加するための一例を追加しました(コメントを参照してください) – sehe

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

あなたは何を意味するのか明確にしてくださいことができます。私はまだ混乱しています:-( –

+0

@SamanthaJ:私はあなたにいくつかのサンプルコードを表示して私の答えを変更しました – Fischermaen

0

RedirectT oAction?すべての例外をキャッチすることは悪いプログラミングの練習であることを

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

これはレスポンスの奇妙さを少なくするためにmvcタグを追加しました:) – sehe

関連する問題