Синтаксический анализ объекта с маршрутом, например ASP.NET MVC. - PullRequest
0 голосов
/ 10 октября 2018

В ASP.NET MVC можно определить маршрут следующим образом:

routes.MapRoute("myroute",
    "myroute/{country}/{name}-{type}",
    new { controller = "MyController", action = "Get" });

И он будет обрабатывать его непосредственно для объекта:

public class MyController : Controller
{
   public HttpResponseMessage Get([FromRoute] MyViewModel model)
   {
      //TODO do stuff with model.
   }
}

Это моя модель представления:

public class MyViewModel
{
    public string Name { get; set; }
    public string Type{ get; set; }
}

Мой вопрос, могу ли я выполнить такой же анализ в простом консольном приложении?

class Program
{
    static void Main(string[] args)
    {
        string route = "myroute/{country}/{name}-{type}";

        string input = "myroute/Denmark/MyName-MyType";

        //TODO Parse input to MyViewModel with route
        MyViewModel result;
    }
}

public class MyViewModel
{
    public string Name { get; set; }
    public string Type { get; set; }
}

Должен быть какой-то способ сделать это, так как это возможно для ASP.NET MVC маршрутизация.

1 Ответ

0 голосов
/ 10 октября 2018

Синтаксический анализ и применение шаблона маршрута на самом деле довольно просто, используя Microsoft.AspNetCore.Routing:

string route = "/myroute/{country}/{name}-{type}";
string input = "/myroute/Denmark/MyName-MyType";

var routeTemplate = TemplateParser.Parse(route);
var matcher = new TemplateMatcher(routeTemplate, null);
var values = new RouteValueDictionary();

if (matcher.TryMatch(input, values))
{
    foreach (var item in values)
    {
        Console.WriteLine("{0}: {1}", item.Key, item.Value);
    }
}
country: Denmark
type: MyType
name: MyName

Однако привязка этого объекта к сущности будет означать, что у вас будетцелое связывание модели стек, который оказывается "немного" более сложным, чтобы раскручиваться по отдельности.Поэтому вместо этого я бы порекомендовал вам сделать это вручную, используя немного размышлений:

public static T BindValues<T>(RouteValueDictionary values)
    where T : new()
{
    var obj = new T();
    foreach (var prop in typeof(T).GetProperties())
    {
        if (values.ContainsKey(prop.Name))
        {
            prop.SetValue(obj, values[prop.Name]);
        }
    }
    return obj;
}

И использовать так:

var obj = BindValues<MyViewModel>(values);

Хотя это, очевидно, намного менее мощныйчем привязка модели, она должна работать достаточно хорошо для вашего варианта использования.

...