asp.net-mvc – 路由参数,自定义模型绑定器还是动作过滤器?
我们的ASP.NET MVC应用程序允许经过身份验证的用户管理链接到其帐户的一个或多个“站点”.
我们的网址是高度可猜测的,因为我们在网址中使用网站友好名称而不是Id,例如: /sites/mysite/ /sites/mysite/settings /sites/mysite/blog/posts /sites/mysite/pages/create 如您所见,我们需要在多个路线中访问站点名称. 我们需要为所有这些操作执行相同的行为: >在当前帐户中查找具有给定标识符的站点 我们始终可以通过ISiteContext对象使用当前帐户.以下是我如何使用普通路由参数实现上述所有操作并直接在我的操作中执行查询: private readonly ISiteContext siteContext; private readonly IRepository<Site> siteRepository; public SitesController(ISiteContext siteContext,IRepository<Site> siteRepository) { this.siteContext = siteContext; this.siteRepository = siteRepository; } [HttpGet] public ActionResult Details(string id) { var site = siteRepository.Get( s => s.Account == siteContext.Account && s.SystemName == id ); if (site == null) return HttpNotFound(); return Content("Viewing details for site " + site.Name); } 这不是太糟糕,但我需要在20个左右的动作方法上做这个,所以想尽可能保持干燥. 我没有做过自定义模型粘合剂,所以我想知道这是否是一个更适合他们的工作.一个关键要求是我可以将我的依赖项注入模型绑定器(对于ISiteContext和IRepository – 如果需要,我可以回退到DependencyResolver). 非常感谢, 本 更新 下面是工作代码,使用自定义模型绑定器和操作筛选器.我仍然不确定我对此的感受是因为 >我应该从模型绑定器上击中我的数据库吗? 型号粘合剂: public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { if (!controllerContext.RouteData.Values.ContainsKey("siteid")) return null; var siteId = controllerContext.RouteData.GetRequiredString("siteid"); var site = siteRepository.Get( s => s.Account == siteContext.Account && s.SystemName == siteId ); return site; } 动作过滤器: public class ValidateSiteAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var site = filterContext.ActionParameters["site"]; if (site == null || site.GetType() != typeof(Site)) filterContext.Result = new HttpNotFoundResult(); base.OnActionExecuting(filterContext); } } 控制器动作: [HttpGet] [ValidateSite] public ActionResult Settings(Site site) { var blog = site.GetFeature<BlogFeature>(); var settings = settingsProvider.GetSettings<BlogSettings>(blog.Id); return View(settings); } [HttpPost] [ValidateSite] [UnitOfWork] public ActionResult Settings(Site site,BlogSettings settings) { if (ModelState.IsValid) { var blog = site.GetFeature<BlogFeature>(); settingsProvider.SaveSettings(settings,blog.Id); return RedirectToAction("Settings"); } return View(settings); } 解决方法
这听起来像是一个动作过滤器的工作.您可以使用动作过滤器进行DI而不是问题.
所以,是的,只需将现有功能转换为动作过滤器,然后将其应用于每个动作或控制器或您继承的基本控制器. 我不太清楚您的网站是如何工作的,但您可以使用全局操作过滤器来检查特定路由值的存在,例如“网站名称”.如果该路由值存在,则意味着您需要检查该站点是否存在… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp-classic – 经典asp – 更好地做很多响应.写或使用<%
- asp.net-mvc – 如何在Asp.Net MVC中做部分帖子?
- asp.net – 模型在表单发布到控制器时始终为NULL
- 如何使用asp.net中的“发布/重定向/获取”a.k.a.“重定向后
- asp.net-mvc – 我什么时候应该在asp.net mvc应用程序中使用
- asp.net – 调用SqlMembershipProvider GetUser的无效Cast
- asp.net-mvc – ASP.NET MVC中的小写URL
- asp.net-vnext中的旧程序集引用错误
- asp.net-mvc – 发布MVC应用程序VS2013时未包含字体文件
- asp.net-mvc – 我可以从HttpContext获取控制器吗?
- asp.net-mvc – RedirectToAction重定向查询参数
- asp.net – Web Deploy和Parameters.xml:如何在
- asp.net – 用JavaScript计算时间间隔
- asp.net – 如何让我的转发器的Itemcommand事件不
- ASP.net缓存访问导致foreach循环中的Collection
- asp.net – 为什么WebMethod声明为静态?
- ASP.NET MVC Url路由支持(点)
- asp.net – 实体框架MVC慢页面加载
- asp.net-mvc – ASP.NET MVC路由问题
- asp.net-mvc – 从Visual Web Developer Express