Сопоставление параметров 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, если бы я добавил что-либо в RouteValueDictionary в RouteData.Values, я мог бы разрешить это в контроллере, добавив его в качестве параметра для контроллера, но, похоже, это не работает в .NET Core.

Это метод RouteAsync моего IRouter:

 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();
}
  

Ответ №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= против 118).aspx