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

1 回答 1

3

听起来你想要一个delegate。对我来说,您的委托类型应该在这里不是很明显 - 可能只是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# 的重要组成部分。网络上有很多关于它们的信息,包括:

于 2012-06-23T19:58:53.290 回答