【发布时间】:2015-12-10 12:11:12
【问题描述】:
系统采用 Asp.Net MVC 4, C#。
在控制器方法执行之前抛出的异常。我不知道如何处理 - 我想将用户重定向到错误页面,但我做不到。
我有一个基本 ViewModel 类,其中包含要在下拉列表中使用的 SelectList。在其构造函数中,ViewModel 从数据库中获取其 SelectListItems。这就是异常的来源。
index 方法以视图模型为参数。
-
这是代码的草图:
class MyViewModel{ public SelectList SelectListModel { get; set; } public MyViewModel() { List<X> xs = GetItemsFromDB(); // <= Exception thrown here List<SelectListItem> SelectListContent = new List<SelectListItem>(); foreach(X x in xs) { SelectListContent.Add(new SelectListItem( Value = x.value,Text=x.text); } SelectListModel = new SelectList(SelectListContent , "Value", "Text"); } } public class MyController : Controller { public ActionResult Index(MyViewModel model) //<< Exception thrown before entering method { //do something } }
我尝试在构造函数中放置一个 try-catch,并在 catch 中使用以下代码:
var context = new HttpContextWrapper(HttpContext.Current);
var rc = new RequestContext(context, new RouteData());
var urlHelper = new UrlHelper(rc);
context.Response.Redirect(urlHelper.Action("Index", "Error", new { messagem = x.Message }), false);
HttpContext.Current.ApplicationInstance.CompleteRequest();
我从其他 SO 答案中得到了这个,但它不起作用。执行此块时,用户不会被重定向到错误页面。相反,MyControllers Index 方法会继续执行。
【问题讨论】:
-
您不应该将模型作为 GET 方法中的参数。以及为什么您要创建一个
SelectList,然后从中创建另一个重复的。并且视图模型不应该有访问数据库的代码。 -
有什么例外?
-
致斯蒂芬:但现在我遇到了这个问题,你知道解决方法吗? to Niff:异常是打开数据库失败(“无法打开数据库等”)。
-
@galmeida,您的问题是您在这里所做的一切都是错误的。视图模型是一个只包含属性的哑类,不应该访问你的数据库——你甚至不能对这段代码进行单元测试。控制器负责调用您的服务并填充视图模型。并且 GET 方法不应该将您的模型作为参数 - 您在控制器中初始化模型
-
@StephenMuecke 感谢您的评论。请您指出一些使用 ViewModel 的指南吗?我之所以这样说是因为许多页面使用相同的下拉菜单,所以这个视图模型是其他视图模型的基类(我在这里简化了代码,它有 6 个字段,包括数组和另一个类的实例)。将“填充”移动到该视图模型上的方法或基本控制器是否不好?
标签: c# asp.net asp.net-mvc exception-handling lifecycle