如何将函数传递给方法?

时间:2012-06-23 19:56:01

标签: c# asp.net-mvc-3

在我的控制器中,我总是得到类似的东西:

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

1 个答案:

答案 0 :(得分:3)

听起来你想要一个委托。对我来说,你的代表类型应该在这里并不是很明显 - 可能只是Action

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

SaveModelIntoDatabase的位置:

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

    // Call the action
    action();
}

如果您希望函数返回某些内容,请使用Func;如果您需要额外的参数,只需将它们添加为类型参数 - 有ActionAction<T>Action<T1, T2>等。

如果你是新来的代表,我强烈建议在进一步学习C#之前先熟悉它们 - 它们非常方便,是现代惯用语C#的重要组成部分。网上有很多关于它们的内容,包括: