2012-06-23 6 views
1

В мой контроллер, я всегда в конечном итоге что-то вроде:Как передать функцию методу?

[HttpPost] 
public ActionResult General(GeneralSettingsInfo model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      // Upload database 
      db.UpdateSettingsGeneral(model, currentUser.UserId); 
      this.GlobalErrorMessage.Type = ErrorMessageToViewType.success; 
     } 
     else 
     { 
      this.GlobalErrorMessage.Type = ErrorMessageToViewType.alert; 
      this.GlobalErrorMessage.Message = "Invalid data, please try again."; 
     } 
    } 
    catch (Exception ex) 
    { 
     if (ex.InnerException != null) 
      while (ex.InnerException != null) 
       ex = ex.InnerException; 

     this.GlobalErrorMessage.Type = ErrorMessageToViewType.error; 
     this.GlobalErrorMessage.Message = this.ParseExceptionMessage(ex.Message); 
    } 

    this.GlobalErrorMessage.ShowInView = true; 
    TempData["Post-data"] = this.GlobalErrorMessage; 

    return RedirectToAction("General"); 
} 

и то, что я хотел бы сделать что-то вроде:

[HttpPost] 
public ActionResult General(GeneralSettingsInfo model) 
{ 
    saveModelIntoDatabase(
     ModelState, 
     db.UpdateSettingsGeneral(model, currentUser.UserId) 
    ); 

    return RedirectToAction("General"); 
} 

Как бы я передать функцию в качестве параметра? Так же, как мы делаем в JavaScript:

saveModelIntoDatabase(ModelState, function() { 
    db.UpdateSettingsGeneral(model, currentUser.UserId) 
}); 
+0

'Действие myFunction' –

+0

' 'delegate' Action <>' ' Func <> ' –

ответ

3

Это звучит, как вы хотите делегат. Это не сразу очевидно для меня, что ваш тип делегата должен быть здесь - возможно, просто Action:

SaveModelIntoDatabase(ModelState, 
    () => db.UpdateSettingsGeneral(model, currentUser.UserId)); 

Где SaveModelIntoDatabase будет:

public void SaveModelIntoDatabase(ModelState state, Action action) 
{ 
    // Do stuff... 

    // Call the action 
    action(); 
} 

Если вы хотите, чтобы функция возвращала что-то, использовать Func; если вам нужны дополнительные параметры, просто добавьте их в качестве параметров типа - есть Action, Action<T>, Action<T1, T2> и т.д.

Если вы новичок делегатов, я настоятельно предлагаю получить гораздо более знакомы с ними, прежде чем гораздо дальше в C# - они действительно удобны и являются неотъемлемой частью современного идиоматического C#. Там очень много в Интернете о них, в том числе:

+0

Единственный раз, когда я использую делегирование, - это работать с событиями под Windows Application ... мне никогда не приходило в голову, что я могу легко сделать то же самое в ASP.NET:/... прочитает о них во-первых, спасибо за указывая на это. – balexandre

Смежные вопросы