作者:叫爸算了_459 | 来源:互联网 | 2022-12-02 16:34
在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> poke..:
使用以下方法解析和应用路径模板实际上非常简单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(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(values);
虽然这显然没有模型绑定那么强大,但它应该可以很好地适用于您的用例.