通过FUNC<比;到我的jsonResponseObj类在MVC4
本文关键字:我的 jsonResponseObj 类在 MVC4 FUNC 通过 | 更新日期: 2023-09-27 18:16:47
我使用了很多Json。. NET在我的MVC4网站,我试图通过在我的JsonNetResult类中使用FUNC来简化一些事情。我发现,当我写一个JsonNetResult控制器动作时,我把所有的东西都包装在同一个try/catch语句中,所以我在JsonNetResult类中创建了一个方法,它接受一个Func作为输入。然而,我发现,对象作为一个输入不工作-我必须是具体的,我已经需要只是做了一堆重载方法,采取不同类型的参数在Func<>
。
在这种情况下是否有方法使用对象作为输入?有没有更好的方法来做我想做的事?我试图坚持DRY,但我不知道如何利用FUNC<>来正确地做到这一点。我很感激任何帮助或指点。
code from controller:
[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;
}
}
你应该改变你的GetResponseObj
方法是通用的:
public void GetResponseObj<T>(Func<T, jsonResponseObj> custom, T arg) where T:class
{
try
{
Data = custom(arg);
}
catch (Exception ex)
{
// alert elmah
Data = new jsonResponseObj(ex);
}
}
但也许这将是更好的解决方案,添加ActionFilter
捕获您的异常:
public class ExceptionToJsonNetResultAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
if (!filterContext.HttpContext.Request.IsAjaxRequest())
return;
if (filterContext.Result is JsonNetResult)
return;
ProcessException(filterContext);
}
private static void ProcessException(ExceptionContext filterContext)
{
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new jsonResponseObj(filterContext.Exception);
};
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
现在你可以用这个属性装饰你的动作,并扔掉你的try/catch块。