Ядро Asp.net Маршрутизация с несколькими необязательными параметрами, вызывающими различные действия - PullRequest
0 голосов
/ 30 января 2019

В Asp.net WebApi2

при вызове api / values ​​/ 9b858599-7639-45da-acd6-a1323fb019b5 get Действие вызывается.

Действие с необязательнымпараметры.

Когда api / values ​​/ 9b858599-7639-45da-acd6-a1323fb019b5? MaxRecords = 100 или api / values ​​/? MaxRecords = 100 GetProducts Action.

В Asp.net Core

Но в ядре asp.net, когда api / values ​​/ 9b858599-7639-45da-acd6-a1323fb019b5 называется GetProducts Действие вызывается.Я хотел вызвать Get action без изменения существующих URL.

Как решить эту проблему в ядре Asp.net 2.0

Contoller

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    [HttpGet("{productId:Guid}", Order = 1)]
    public ActionResult<string> Get(Guid productId)
    {
        return "value1";
    }


    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
    //https://localhost:44323/api/values/?maxRecords=100
    [HttpGet("{startRecordId:Guid?}")]
    public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, int maxRecords, DateTimeOffset? minimumChangeDate = null)
    {
        return new string[] { "value1", "value2" };

    }

}

Startup.cs

app.UseMvc(routes =>
        {
            routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute("DefaultApi", "api/{controller}/{id?}");
        });

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Хотя это и не идеально, и это временный рожок для обуви, пока вы не сможете обновить клиентские вызовы.Вы можете попробовать это, , если , вы можете предположить, что у вас должно быть maxRecords QueryString.Поскольку, если он по умолчанию равен 0, он бесполезен, если только у вас нет логики в случае, если он равен 0.

    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    [HttpGet("{productId:Guid}", Order = 1)]
    public ActionResult<string> Get(Guid productId)
    {
        return "value1";
    }


    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
    //https://localhost:44323/api/values/?maxRecords=100
    [HttpGet("{startRecordId:Guid?}")]
    public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, [FromQuery] int maxRecords, [FromQuery] DateTimeOffset? minimumChangeDate = null)
    {
        if (!Request.GetDisplayUrl().Contains(nameof(maxRecords)) &&
            startRecordId.HasValue)
        {
            return Get(startRecordId.Value);
        }

        return new string[] { "value1", "value2" };

    }
0 голосов
/ 20 августа 2019

Вы можете комбинировать свои действия и изменять поведение в зависимости от того, какие параметры имеют указанное значение;

    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
    //https://localhost:44323/api/values/?maxRecords=100
    [HttpGet("{startRecordId:Guid?}")]
    public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, int? maxRecords, DateTimeOffset? minimumChangeDate = null)
    {
        if (startRecordId.HasValue && !maxRecords.HasValue)
            return "value";
        else
            return new string[] { "value1", "value2" };

    }
0 голосов
/ 30 января 2019

Ваши URI не соответствуют соглашению RESTful.Честно говоря, я не могу понять, как вы вообще когда-либо делали эту работу, потому что та же проблема должна была привести к ASP.NET Web Api, но, возможно, вам просто повезло в способе маршрутизации в ASP.NET.Веб-интерфейсASP.NET Core обрабатывает маршрутизацию совершенно по-разному.

В любом случае, маршрут для списка из нескольких продуктов должен , а не содержать идентификатор в фактическом URI.Другими словами:

/api/values - Multiple values
/api/values/{id} - Single value

Для таких вещей, как фильтрация, упорядочение и т. Д. Несколько записей, они должны быть частью строки запроса.Это включает что-то вроде startRecordId:

/api/values?startRecordId={id}

Устраните неоднозначность в ваших маршрутах, и у вас не возникнет проблем.Длинный и короткий, у вас не может быть двух маршрутов, принимающих Guid в одном и том же сегменте пути, даже если это необязательно для одного.Переместите startRecordId в строку запроса, что в любом случае является правильным способом сделать это, и все готово.

...