【发布时间】:2021-03-06 02:00:26
【问题描述】:
我想为 ASP.NET Core 中的操作构建 url。有一种方便的方法可以做到这一点 - 使用IUrlHelper 接口,它可以通过Url 属性在任何控制器中访问。不幸的是,UrlHelper 使用ToString() 方法进行参数序列化,我不知道如何为特定类型自定义序列化。这会导致请求模型中的自定义类型出现问题:
public class ComplexFilter {
public string A { get; set; }
public string B { get; set; }
public override string ToString() {
return $"[A = {A}, B = {B}]";
}
}
public class WebRequest {
[FromRoute]
public string Id { get;set; }
[FromQuery]
public ComplexFilter Filter { get;set; }
}
我想使用 WebRequest 类作为我的控制器操作的参数,其 url 结构类似于 search/{id}?filter=A-B:
[HttpGet("search/{id}")]
public ActionResult Search(WebRequest request) {
return Ok();
}
我不想覆盖我的ComplexFilter 的ToString() 方法,因为它用于应用程序的其他部分,并且具有更友好的日志记录和调试格式。
在这种情况下有两个问题:
- 我需要从请求中反序列化
ComplexFilter。这可以在TypeDescriptor的帮助下完成:TypeDescriptor.AddAttributes(typeof(ComplexFilter), new TypeConverterAttribute(typeof(ComplexFilterTypeConverter))); - 我需要序列化
ComplexFilter以生成链接。如果我只是调用Url.Action("Search", new WebRequest { Id = "id", Filter = new ComplexFilter { A = "A", B = "B" } }),那么我会得到以下网址:/action/id?filter=[A = \"A\", B = \"B\"],但我想得到/action/id?filter=A-B。
所以我的问题是 - 如何自定义 UrlBuilder 参数序列化行为,为 CustomFilter 类添加自定义序列化逻辑?
【问题讨论】:
标签: c# asp.net-core