asp.net-coreasp.net-core-mvcasp.net-core-webapi

I send the Id to correct url but in controller I read Id = 0 always


I'm trying to list incoming messages by category so in UI part when admin click on category, then in the controller, the Id shows up as zero.

I sent to Id number of categories to related urls but couldn't read the value of Ids in controller.

<div class="list-group mail-list">
    <a href="/AdminContact/InboxByCategory/2" class="list-group-item border-0"><span class="fa fa-briefcase f-s-14 mr-2"></span>Şikayet</a>
    <a href="/AdminContact/InboxByCategory/1" class="list-group-item border-0"><span class="fa fa-sellsy f-s-14 mr-2"></span>Teşekkür</a>
    <a href="/AdminContact/InboxByCategory/4" class="list-group-item border-0"><span class="fa fa-ticket f-s-14 mr-2"></span>Talep</a>
    <a href="/AdminContact/InboxByCategory/3" class="list-group-item border-0"><span class="fa fa-tags f-s-14 mr-2"></span>Öneri</a>
</div>
public class AdminContactController : Controller
{
     private readonly IHttpClientFactory _httpClientFactory;

     public AdminContactController(IHttpClientFactory httpClientFactory)
     {
         _httpClientFactory = httpClientFactory;
     }

     public async Task<IActionResult> InboxByCategory(int categoryId)
     {
         var token = HttpContext.Session.GetString("AuthToken");

         if (string.IsNullOrEmpty(token))
         {
             return Unauthorized();
         }

         var client = _httpClientFactory.CreateClient();
         client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

         var response = await client.GetAsync($"http://localhost:10881/InboxListByCategory/{categoryId}");

         if (response.IsSuccessStatusCode)
         {
             var jsonData = await response.Content.ReadAsStringAsync();
             var values = JsonConvert.DeserializeObject<List<InboxContactDto>>(jsonData);
             return View("Inbox", values);
         }

         return View("Inbox");
     }

     public async Task<IActionResult> Inbox()
     {
         var token = HttpContext.Session.GetString("AuthToken");

         if (string.IsNullOrEmpty(token))
         {
             return Unauthorized();
         }

         var client = _httpClientFactory.CreateClient();
         client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

         var response = await client.GetAsync("http://localhost:10881/InboxList");

         if (response.IsSuccessStatusCode)
         {
             var jsonData = await response.Content.ReadAsStringAsync();
             var values = JsonConvert.DeserializeObject<List<InboxContactDto>>(jsonData);
             var contactCount = await GetContactCount();
             ViewBag.ContactCount = contactCount;
             ViewBag.SendMessageCount = await GetSendMessageCount();
             return View(values);
         }

         return View();
     }
}

Solution

  • The post didn't contain the route declaration. But it's necessary to define proper route declaration by using conventional route (see Set up conventional route) or by using the Route attribute:

    [Route("[controller]/[action]/{categoryId}")]
    public async Task<IActionResult> InboxByCategory(int categoryId)
    {
      ....
    }
    

    In case your application already contains the "default" route declaration generated by template

    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    

    you can just change the action method parameter name from categoryId to id:

    public async Task<IActionResult> InboxByCategory(int id)