Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将RouteData.Values参数映射到.NET Core中的控制器参数_C#_Asp.net Core_Asp.net Mvc Routing_Asp.net Core Mvc - Fatal编程技术网

C# 将RouteData.Values参数映射到.NET Core中的控制器参数

C# 将RouteData.Values参数映射到.NET Core中的控制器参数,c#,asp.net-core,asp.net-mvc-routing,asp.net-core-mvc,C#,Asp.net Core,Asp.net Mvc Routing,Asp.net Core Mvc,在.NET 4.5中,如果我在RouteData.Values中的RouteValueDictionary中添加了任何内容,我可以通过将其作为控制器的In参数添加到控制器中来解决此问题,但这在.NET Core中似乎不起作用 这是我的IRouter的RouteAsync方法: public async Task RouteAsync(RouteContext context) { if (context == null) throw new ArgumentNullException(n

在.NET 4.5中,如果我在RouteData.Values中的RouteValueDictionary中添加了任何内容,我可以通过将其作为控制器的In参数添加到控制器中来解决此问题,但这在.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参数不也设置为这个?我需要为模型绑定添加一些中间件吗

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

routedData
可以通过控制器实例作为属性进行访问。

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);
    }
}
为了更简洁的实现,您可以创建一个抽象控制器来实现这一点

参考: