我在我的 MVC4 站点中使用了很多 Json.NET,我试图通过在我的 JsonNetResult 类中使用 FUNC 来简化一些事情。我发现在编写 JsonNetResult 控制器操作时,我将所有内容都包装在同一个 try/catch 语句中,因此我在 JsonNetResult 类中创建了一个方法,该方法将 Func 作为输入。但是,我发现作为输入的对象不起作用——我必须具体一点,我已经完成了一堆重载方法,它们将不同类型作为Func<>
.
在这种情况下,有没有办法使用对象作为输入?有没有更好的方法来做我想做的事情?我试图坚持 DRY,但我不知道如何利用 FUNC<> 来正确地做到这一点。我感谢任何帮助或指示。
来自控制器的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonNetResult jsonUpdateProfile(UserProfile u)
{
JsonNetResult j = new JsonNetResult();
var x = ModelState;
Func<UserProfile, jsonResponseObj> updater = p => updateUserProfile(p);
j.GetResponseObj(updater, u);
return j;
}
private jsonResponseObj updateUserProfile(UserProfile u)
{
UserProfile updateUser = db.UserProfiles.Find(u.UserId);
updateUser = u;
updateUser.UpdatedBy = u.UserName;
updateUser.UpdatedOn = DateTime.Now;
db.SaveChanges();
return new jsonResponseObj(null,"Profile Updated");
}
来自 JsonNetResult 的代码:ActionResult
public void GetResponseObj(Func<object, jsonResponseObj> custom, object arg)
{
try
{
Data = custom.Invoke(arg);
}
catch (Exception ex)
{
// alert elmah
Data = new jsonResponseObj(ex);
}
}
这个jsonResponseObj
类只是我的 JSON 数据的包装器,用于标准化所有响应:
public class jsonResponseObj
{
public string status { get; set; }
public Object data { get; set; }
public string msg { get; set; }
public jsonResponseObj(Object data, string msg = "")
{
this.status = "OK";
this.data = data;
this.msg = msg;
}
public jsonResponseObj(Exception ex)
{
this.status = "ERROR";
this.msg = ex.Message;
}
}