2

意味のある 1 つの方法だけが変化する関数テンプレートを作成したいと考えています。現在、MVC アプリケーションでユーザー設定を変更するために、個別の ActionResult を作成しています。多くのオプションがあり、チェックボックスごとに新しい ActionResult メソッドを書き出すのにうんざりしているので、ドット表記でオブジェクトメンバーを明示的に設定しない場合に値にアクセスして設定する方法について少し指示が必要です。

現在のチェックボックス ActionResult の例を次に示します。

public ActionResult ChangeActivityShowNewProduct(bool value)
{
    var _id = Convert.ToInt32(Session["ID"]);
    var dataContext = new SecurityDataContext();
    var x = from c in dataContext.UserSettings
            where c.UserID == _id
            select c;

    foreach (var setting in x)
    {
        setting.ActivityShowNewProduct = value;
    }

    dataContext.SubmitChanges();

    Session["ActivityShowNewProduct"] = value;

    return Json(Session["ActivityShowNewProduct"], JsonRequestBehavior.AllowGet);
}

別の例は非常に似ていますが、「ChangeActivityShowNewUser」と呼ばれる可能性があります。基になるコードの唯一の違いは、setting.ActivityShowNewUser代わりに foreach ループを使用することです (セッション変数と同様に、それらの割り当てについては心配していません)。

settingのメンバーを文字列で設定する方法はありますか? おそらく foreach ループの外ですか?私はまだ IQueryable オブジェクトに精通していないので、どこから調べればよいかわかりません。どんな参考資料でも大歓迎です!

アップデート


では行きましょう。それは機能しますが、少し繰り返します。私はそれに取り組んでいます。他人のための投稿および/または批評。みんなありがとう。

Func<int, bool, Action<UserSetting>, bool> CheckBoxChanger = (i, b, v) =>
{
    var _id = i;

    var dataContext = new SecurityDataContext();
    var x = from c in dataContext.UserSettings
            where c.UserID == _id
            select c;

    foreach (var setting in x)
    {
        v(setting);
    }

    dataContext.SubmitChanges();

    return b;
};

public ActionResult CheckBoxSettingChange(Action<UserSetting> valueSetter, bool result, string SessionName)
{
    Session[SessionName] = CheckBoxChanger(Convert.ToInt32(Session["ID"]), result, valueSetter);

    return Json(Session[SessionName], JsonRequestBehavior.AllowGet);
}

public void DoIt(string name, bool val)
{
    switch (name)
    {
        case "ChangeActivityShowNewProduct":
            CheckBoxSettingChange(setting => setting.ActivityShowNewProduct = val, val, name);
            break;

        // ... etc etc etc
    }
}
4

1 に答える 1

2

ループを実行しているときには、foreachそれは単なるクエリではありません。それが結果として具現化されました。

このメソッドに、アイテムを取得してその値を設定するメソッドを受け入れるようにさせることができます。次に、各アイテムでそのメソッドを呼び出すだけです。

public ActionResult ChangeActivityShowNewProduct(Action<UserSetting> valueSetter)
{
    //...
    foreach (var setting in x)
        valueSetter(setting);
    //...
}

次に、それを呼び出すには、次のようになります。

ChangeActivityShowNewProduct(setting => setting.ActivityShowNewProduct = false);
于 2013-11-05T20:04:18.583 に答える