Веб-API Url.Link всегда возвращает ноль - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующие настройки в WebApiConfig

configuration.Routes.MapHttpRoute(
   name: "ConfirmEmailRoute",
   routeTemplate: "api/account/ConfirmEmail/{userId=userId}/{code=code}",
   defaults: new { userId = RouteParameter.Optional, code = RouteParameter.Optional }
);

И это действие в контроллере

[RoutePrefix("api/account")]
public class AccountController : BaseApiController
{

    [AllowAnonymous]
    [HttpGet]
    [Route("ConfirmEmail/{userId=userId}/{code=code}", Name = "ConfirmEmailRoute")]
    public async Task<IHttpActionResult> ConfirmEmail(string userId = "", string code = "")
    {
        if (string.IsNullOrWhiteSpace(userId) || string.IsNullOrWhiteSpace(code))
        {
            ModelState.AddModelError("", "User Id and Code are required");
            return BadRequest(ModelState);
        }

        var result = await this.UserManager.ConfirmEmailAsync(userId, code);

        if (result.Succeeded)
        {
            return Ok("Email has been successfully confirmed");
        }
        else
        {
            return GetErrorResult(result);
        }
    }
}

И я использую следующее для генерации его URL

Url.Link("ConfirmEmailRoute", new { userId = user.Id, code = code })

Но это всегда возвращает ноль.

Я также пытался добавить контроллер и Action, например:

Url.Link("ConfirmEmailRoute", new { userId = user.Id, code = code, controller = "Account", Action = "ConfirmEmail" })

Не работает либо

имена параметров одинаковы, я не понимаю, почему это не работает!

1 Ответ

0 голосов
/ 11 апреля 2020

Итак, после нескольких попыток я понял, что если я изменю шаблон маршрута следующим образом:

routeTemplate: "api/account/ConfirmEmail/{userId}/{code}"

Url.Link будет работать, но теперь строковые параметры запроса не будут работать для действия ConfirmEmail .

Поэтому я решил удалить Url.Link и использовать запрос для создания URL-адреса самостоятельно, как показано ниже:

var rootUrl = new Uri(Request.RequestUri, RequestContext.VirtualPathRoot).ToString();

rootUrl += "api/account/ConfirmEmail?userId=userId&code=code";
...