Передача имени в URL вместо идентификатора выдает ошибку - PullRequest
1 голос
/ 18 июня 2019

У меня в списке отображаются вакансии на мой взгляд, когда я нажимаю на эту ссылку, я должен перейти на другую страницу, чтобы отобразить полную информацию, а в браузере URL должен отображаться, как показано ниже

// mysite.com/jobs/auto-damage-adjuster-trainee-houston-and-surrounding-cities.

Чтобы добиться этого, я пытаюсь отправить форму по клику и передать скрытое значение контроллеру. Но оно всегда выдает ошибку 404. всегда передает id null заданию actionresult.

Index.cshtml-

@model List<JobPortal.Models.MyDB>
@{
    ViewBag.Title = "Current List";
 }

 @using (Html.BeginForm())
 {
     @Html.AntiForgeryToken()
     @foreach (var list in Model)
     {
       <div class="row">
           <div class="flexcontainer">
              @Html.Partial("_MySharedView", list)
           </div>
       </div>
    }
 }

Общий вид:

@model JobPortal.Models.MyDB
@if (Model.JDetails.Count > 0)
{
   @foreach (var item in JDetails)
{
   @{ var Url = @item.title.Replace(" ", "-").Replace('/', '-').Replace('?', '-').Replace(':', '-');}
    <form id="Jobs-@item.id" action="~/Index?id=@item.id" method="post">
    <input type="hidden" name="id" id="id" value=@item.id />
    <strong><a href="~/Jobs?@Url" onclick="document.getElementById('Jobs-@item.id').submit();">@item.title</a></strong>
    </form>
  }
}

Контроллер -

 [HttpPost]
 public ActionResult Index(int? id)
 {
     var newId = (int)id;
     return RedirectToAction("Jobs", new { id = newId });
  }


  [HttpGet]
  public ActionResult Jobs(int? id)
  {
      var allDetails = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
      return View(allDetails);
   }

Rout config

        routes.MapRoute(
            "Jobs",
            "{controller}/{action}/{name}",
        new { contrller = "jobController", action = "Jobs", name = UrlParameter.Optional }
        );

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

В вашем общем представлении измените:

<form id="Jobs-@item.id" action="~/Index?id=@item.id" method="post">

на:

<form id="Jobs-@item.id" action="~/Index/@item.id" method="post">
0 голосов
/ 19 июня 2019

Когда этот код запускается

return RedirectToAction("Jobs", new { id = newId });

значение, содержащееся в id, теряется, когда вы попадаете сюда

public ActionResult Jobs(int? id)

, поскольку в таблице маршрутизации вы не указали id, только name.

routes.MapRoute(
"Jobs",
"{controller}/{action}/{name}",
new { contrller = "jobController", action = "Jobs", name = UrlParameter.Optional });

Могу ли я предложить это проверенное быстрое исправление:

В контроллере:

[HttpPost]
public IActionResult Index(int id)
{
    var name = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
    return RedirectToAction(nameof(Jobs), new { id, name });
}

[HttpGet]
public IActionResult Jobs(string name, int id)
{
    var allDetails = _db.MyDB.Where(p => p.id == id).FirstOrDefault();
    return View(allDetails);
}

и в таблице маршрутизации:

routes.MapRoute(
    name: "Jobs",
    template: "{controller}/{name}/{id}",
    defaults: new { controller = "jobController", action="Jobs" });

В вашем коде еще многое можно улучшить, но я надеюсь, что это прояснит ваш вопрос.Удачного кодирования!

0 голосов
/ 18 июня 2019

В вашем контроллере идентификатор должен быть string для работы

   [HttpGet]
   public ActionResult Jobs(string name)
   {
      var allDetails = _db.MyDB.Where(p => p.name == name).FirstOrDefault();
      return View(allDetails);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...