【问题标题】:Marry RouteData.Values with Action Parameters将 RouteData.Values 与操作参数结合
【发布时间】:2012-05-23 14:11:28
【问题描述】:

我在自定义 Action Filter 中设置了一些 RouteData

filterContext.RouteData.Values.Add("accountId", accountId);
filterContext.RouteData.Values.Add("permission", (int)permission);

然后我有如下动作

public ActionResult Get(Guid accountId, int permission, int id) {

}

我可以通过路由将RouteData 值与操作参数结合吗?如果有,怎么做?

我只想使用一个 URL,例如

http://localhost/Users/Get/1

他们的路线数据存在并且可以通过使用来检索

Guid accountId = (Guid)RouteData.Values["accountId"];
Permission permission = (Permission)RouteData.Values["permission"];

【问题讨论】:

  • 我想使用我在自定义操作过滤器中设置的 RouteData 填充操作参数,以便它不会真正附加到 URL。基本上,我正在从登录时设置的缓存/会话中检索一些值,并且需要将这些值用作许多控制器操作的基础。

标签: c# asp.net-mvc routing


【解决方案1】:

您应该创建自定义 ValueProvider,而不是操作过滤器。
如需更多信息,请参阅here

【讨论】:

  • 谢谢,我试一试,这个问题与我上一个问题的第一个答案直接相关。考虑到我的情况,您认为自定义 ValueProvider 是否可行?
  • 此外,并非所有操作都需要这些“隐藏”路由数据值。那些不使用它们的会发生什么?
  • @Marko:模型绑定器将询问您的 ValueProvider 是否具有任何参数名称的值。如果它不要求您提供这两个名称,则您的 ValueProvider 不应该做任何事情。
  • 嗯,好的,唯一的问题是 NameValueCollection 只接受字符串,而我有一个整数和 guid 操作参数。您是否设法查看了另一个问题,看看这是否是一个好主意?
  • @Marko:您可以自定义IValueProvider,返回您想要的任何内容。这个想法似乎不错。
【解决方案2】:

您可以使用 ActionParameters 属性:

public class MyActionFilterAttribute: ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.ActionParameters["accountId"] = Guid.NewGuid();
        filterContext.ActionParameters["permission"] = 456;
    }
}

然后:

public class HomeController : Controller
{
    [MyActionFilter]
    public ActionResult Index(Guid accountId, int permission, int id)
    {
        return Content(string.Format("accountId={0}, permission={1}", accountId, permission));
    }
}

当您请求/home/index/123 时,将显示以下内容:

accountId=f72fddb8-1c35-467b-a479-b2668fd5b2ec, permission=456

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多