【发布时间】:2013-11-16 20:08:55
【问题描述】:
我想制作一个仅以一种有意义的方式更改的函数模板。我目前正在创建单独的 ActionResult 来更改我的 MVC 应用程序中的用户设置。有很多选项,我已经厌倦了为每个复选框编写一个新的 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”,其中底层代码的唯一区别在于 foreach 循环中使用 setting.ActivityShowNewUser 代替(以及会话变量,但我不担心分配这些)。
有没有用字符串设置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
}
}
【问题讨论】:
-
我觉得你的更新版本不错。
标签: c# asp.net-mvc iqueryable