是否可以在 ASP.NET MVC 路径中的查询字符串变量到达控制器之前更改它?

2023-11-23

我在 ASP.NET MVC 中有一个控制器方法,如下所示:

public ActionResult GetAlbumPictures(int albumId)
{
    var album = AlbumRepo.GetSingle(albumId);
    var pictures = album.Pictures;
    return View(pictures);
}

该方法的路由如下所示:

routes.MapRoute(null,
                "pictures"
                new { controller = "Album", action = "GetAlbumPictures" });

用户将使用以下 URL 来获取按相册 ID 过滤的图片:

GET http://server/pictures?albumid=10

但是,我想将查询字符串参数更改为album代替albumid:

GET http://server/pictures?album=10

这意味着控制器方法需要修改为:

public ActionResult GetPictures(int album)
{
    ...
}

然而,这并不理想,因为现在该方法有一个名为album,这可能会被混淆为Album object而不是ID of the Album.

我的问题是,是否有任何方法可以配置 ASP.NET MVC,以便在路由中它将收到一个名为的查询字符串参数album,但随后将其传递给控制器​​作为albumId范围?

P.S.我知道我可以在路由表中执行此操作:

routes.MapRoute(null,
                "album/{albumId}/pictures",
                new { controller = "Album", action = "GetAlbumPictures" });

但由于遗留问题,我必须使其也适用于查询字符串方法。


您可以创建自定义操作过滤器属性来处理这种情况。我还没有测试这个具体的实现,但总体思路是做这样的事情:

public class AlbumAttribute : ActionFilterAttribute
    {
         public override void OnActionExecuting(ActionExecutingContext filterContext)
         {
             var albumId = filterContext.HttpContext.Request.QueryString["album"] as string;
             filterContext.ActionParameters["albumId"] = albumId;

             base.OnActionExecuting(filterContext);
         }
    }

然后,使用 [Album] 属性装饰您的操作方法:

[Album]
public ActionResult GetAlbumPictures(int albumId)
{
    var album = AlbumRepo.GetSingle(albumId);
    var pictures = album.Pictures;
    return View(pictures);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 ASP.NET MVC 路径中的查询字符串变量到达控制器之前更改它? 的相关文章

随机推荐