【问题标题】:Map RouteData.Values parameters to controller parameter in .NET Core将 RouteData.Values 参数映射到 .NET Core 中的控制器参数
【发布时间】:2016-10-11 15:16:44
【问题描述】:

在 .NET 4.5 中,如果我在 RouteData.Values 的 RouteValueDictionary 中添加任何内容,我可以通过将其添加为控制器的参数来在控制器中解决此问题,但这似乎在 .NET Core 中不起作用。

这是我的 IRouter 的 RouteAsync 方法:

public async Task RouteAsync(RouteContext context)
{
    if (context == null) throw new ArgumentNullException(nameof(context));

    var model = GetMyModel();
    if (model == null)
    {
        await _target.RouteAsync(context);
        return;
    }
    context.RouteData.Values["mymodel"] = model;
    var routeValues = new RouteValueDictionary
    {
        {"controller", pageController.Name.Replace("Controller", string.Empty)},
        {"action", "Index"},
        {"mymodel", model }
    };

    var tokenValues = new RouteValueDictionary
    {
        {"mymodel", model }
    };
    // Set our values to the route data. 
    // Don't do it when creating the snapshot as we'd like them to be there after the restore as well.
    foreach (var tokenValueKey in tokenValues.Keys)
    {
        context.RouteData.DataTokens[tokenValueKey] = tokenValues[tokenValueKey];
    }
    foreach (var routeValueKey in routeValues.Keys)
    {
        context.RouteData.Values[routeValueKey] = routeValues[routeValueKey];
    }

    // This takes a snapshot of the route data before it is routed again
    var routeDataSnapshot = context.RouteData.PushState(_target, routeValues, tokenValues);

    try
    {
        await _target.RouteAsync(context);
    }
    finally
    {
        // Restore snapshot
        routeDataSnapshot.Restore();
    }
}

在这之后,实际上调用了我的控制器,但参数 mymodel 只是一个默认值,而不是我在路由器中设置的值。如果我查看 RouteData.Values 键“mymodel”就在那里并且有一个值。为什么 in-parameter 也没有设置为此?我需要为模型绑定添加一些中间件吗?

public IActionResult Index(MyModelClass mymodel)
{
    return View();
}

【问题讨论】:

    标签: c# asp.net-core asp.net-mvc-routing asp.net-core-mvc


    【解决方案1】:

    RouteData 可通过控制器实例作为属性访问。

    public class SomeControllerController : Controller {
        public IActionResult Index() {
            if (base.RouteData.Values.ContainsKey("mymodel") == false) {
                return NotFound();
            }
            MyModel model = (MyModel) base.RouteData.Values["mymodel"];
            //LOGIC...
            return Index(model);
        }
    }
    

    为了更简洁的实现,您可以创建一个抽象控制器来执行此操作。

    参考:https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.routedata(v=vs.118).aspx

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2020-11-19
      • 2015-05-09
      • 2017-07-04
      • 2017-05-17
      相关资源
      最近更新 更多