ASP.NET MVC:如何从视图切换不同的DataContext?求解决方案
解决ASP.NET MVC中切换DbContext的问题
我来帮你搞定这个切换数据源的问题!你的代码核心问题在于HttpPost方法没有传递切换后的数据源数据,而且DbContext的使用方式也可以优化,下面一步步给你解决:
问题出在哪?
你当前的HttpPost方法只是把选中的存储类型存到ViewData里,然后直接返回视图,但这个过程不会触发HttpGet的Index方法——也就是说,视图根本拿不到切换后数据源的Productos列表。另外,把DbContext作为控制器的私有字段长期持有也不是最佳实践,DbContext是轻量级对象,应该随用随创建、用完就释放。
修复后的控制器代码
我们调整一下控制器逻辑,让Post请求重定向到Get方法,同时传递选中的存储类型参数,这样Get方法就能根据参数查询对应数据源的数据:
public class HomeController : Controller { // GET: Home public ActionResult Index(string storageTypes = "1") { IEnumerable<Producto> productos; // 根据选中的存储类型选择对应的DbContext switch (storageTypes) { case "2": // 使用using确保DbContext及时释放 using (var db2 = new DbContextB()) { productos = db2.Productos.ToList(); } break; default: using (var db1 = new DbContextA()) { productos = db1.Productos.ToList(); } break; } // 把选中的值传给视图,保持下拉框的选中状态 ViewBag.SelectedStorage = storageTypes; return View(productos); } [HttpPost] public ActionResult Index(FormCollection form) { string selectedStorage = form["StorageTypes"].ToString(); // 重定向到Get方法,传递选中的存储类型参数 return RedirectToAction("Index", new { storageTypes = selectedStorage }); } }
优化视图(保持下拉框选中状态)
修改视图里的下拉列表,让它根据ViewBag的值自动选中用户之前选择的选项:
@using (Html.BeginForm()) { <p>Please select the data storage mode:</p> <div> <select id="StorageTypes" name="StorageTypes"> <option value="1" @(ViewBag.SelectedStorage == "1" ? "selected" : "")>Storage 1</option> <option value="2" @(ViewBag.SelectedStorage == "2" ? "selected" : "")>Storage 2</option> </select> <input type="submit" value="Accept" /> </div> }
额外小建议
- 始终用
using包裹DbContext实例,确保数据库连接及时释放,避免资源泄漏。 - 如果你的项目支持依赖注入(比如ASP.NET MVC 5及以上版本),可以把
DbContext注册为服务,通过构造函数注入,这样更便于单元测试和代码维护。
这样修改后,当你选择存储类型点击提交,页面会重新加载对应数据源的产品列表,下拉框也会保持你的选中状态,完美实现切换效果!
内容的提问来源于stack exchange,提问作者Luis Acuña
相关产品推荐
相关产品推荐

