簡體   English   中英

傳遞params object []會更改Url.Action生成的URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM