2011-12-19 205 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