使用一个使用期望Func
的基本方法的Actionpublic class HomeController: BaseController
{
public JsonResult HomeController()
{
var model = ExecuteHandledJTableJsonOperation(() =>
{
//do some stuff
}, LocalResources.CommonErrorMessage);
return Json(model);
}
}
期待Func的基本方法
public class BaseController : Controller
{
public T ExecuteHandledJTableJsonOperation<T>(Func<T> actionToExecute, string errorMessage)
{
try
{
return actionToExecute.Invoke();
}
catch (Exception ex)
{
LogEntry entry = new LogEntry();
entry.AddErrorMessage(ex.Message);
entry.AddErrorMessage(String.Format("Inner Exception:", ex.InnerException.Message));
//entry.Message = ex.Message;
entry.Priority = 1;
entry.EventId = 432;
entry.Severity = System.Diagnostics.TraceEventType.Error;
writer.Write(entry);
return Json(new { Result = "ERROR", Message = errorMessage });
}
}
}
当我尝试返回Json时,它检索到一个错误(new {Result =“ERROR”,Message = errorMessage});
无法将类型'System.Web.Mvc.JsonResult'隐式转换为'T'
我知道如果我创建一个ExecuteHandledJTableJsonOperation
的覆盖,期望两个动作,一个正常执行/返回,第二个在操作有一个异常时执行,那就更好了。
这样的事情:
return ExecuteHandledJTableJsonOperation(() =>
{
//do something
return Json(new { Result = "OK", Records = excepciones, TotalRecordCount = excepciones.Count() });
}, () =>
{
return Json(new { Result = "ERROR", Message = Properties.Resources.CommonErrorMessage });
});
但我想知道如何解决第一种情况:
无法将类型'System.Web.Mvc.JsonResult'隐式转换为'T'
感谢。
答案 0 :(得分:0)
为什么您的方法是通用的并不完全清楚,因为您似乎总是要返回JsonResult
,因此只需将方法更改为此。
public class BaseController : Controller
{
public JsonResult ExecuteHandledJTableJsonOperation<T>(Func<JsonResult> actionToExecute, string errorMessage)
{
try
{
return actionToExecute.Invoke();
}
catch (Exception ex)
{
LogEntry entry = new LogEntry();
entry.AddErrorMessage(ex.Message);
entry.AddErrorMessage(String.Format("Inner Exception:", ex.InnerException.Message));
//entry.Message = ex.Message;
entry.Priority = 1;
entry.EventId = 432;
entry.Severity = System.Diagnostics.TraceEventType.Error;
writer.Write(entry);
return Json(new { Result = "ERROR", Message = errorMessage });
}
}
}
答案 1 :(得分:0)
我想你不需要那么太通用了。如果您仅在操作中使用该功能,则可以ActionResult
derived from it返回JsonResult
。认为在您的情况下添加ActionResult的constraint就足够了:
public T ExecuteHandledJTableJsonOperation<T>(Func<T> actionToExecute, string errorMessage)
where T: ActionResult
{
//code
}