[英]Passing params object[] changes URL generated by Url.Action
我在許多API方法中都使用Url.Action
方法來指定到當前對象和相關對象的路由。 代碼如下:
public class FooController : BaseController
{
protected override string ControllerName => "FooController";
[HttpGet("{id}")]
public IActionResult GetSingle(int id)
{
var entity = base.DbContext.FooEntities.SingleOrDefault(f => f.Id == id);
var selfUrl = Url.Action(
action: nameof(GetSingle),
controller: this.ControllerName,
protocol: Request.Scheme,
values: new { id }
);
var viewModel = mapper.Map<FooViewModel>(entity, selfUrl);
return Ok(viewModel);
}
}
此代碼產生預期的URL。
http://localhost:1080/foo/1
由於Request.Scheme屬性始終相同,而ControllerName是BaseController中的抽象屬性,因此我嘗試將URL構建方法提取到BaseController中,如下所示:
protected string GetActionUrl(string actionName, params object[] values)
{
return Url.Action(
action: actionName,
controller: this.ControllerName,
protocol: Request.Scheme,
values: values);
}
並從FooController的GetSingle方法中調用它,如下所示:
var selfUrl = base.GetActionUrl(nameof(GetSingle), id);
但是,這產生了完全不同的URL:
http://localhost:1080/foo?Length=1&LongLength=1&Rank=1&SyncRoot=1&SyncRoot=System.Object%5B%5D&IsReadOnly=False&IsFixedSize=True&IsSynchronized=False
我嘗試將ID包裝到新的對象結構中:
var selfUrl = base.GetActionUrl(nameof(GetSingle), id);
這並沒有太大幫助:
http://localhost:1080/foo?Length=1&LongLength=1&Rank=1&SyncRoot=%7B%20id%20%3D%201%20%7D&IsReadOnly=False&IsFixedSize=True&IsSynchronized=False
是什么導致此行為? 以及我應該如何實現/編碼GetActionUrl方法,以便獲得所需的結果?
模型綁定程序顯然無法將值識別為參數。 您需要某種方法來映射鍵和值。 您可以為此使用匿名類,但是對於您而言,使用RouteValueDictionary
會更容易。
因此,實例化該字典的實例,按通常的方式填充它,並將其傳遞給此方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.