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

代理人が必要なようです。あなたのデリゲートタイプがここにあるべきかどうかは私にはすぐにはわかりません-おそらくただ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#の重要な部分です。それらについては、次のような多くの情報がWeb上にあります。

于 2012-06-23T19:58:53.290 に答える