У меня есть таблица записей, отображаемых в частичном представлении, и некоторые из них не имеют значений идентификатора. Поэтому я пытаюсь использовать альтернативное поле в качестве идентификатора при нажатии ссылки «Изменить» для конкретной записи. Я не уверен, могу ли я на законных основаниях иметь два метода действия Post, хотя я использую разные имена методов и параметры.
В настоящее время, если я нажимаю на запись с идентификатором, вызывается правильный метод действия. Если я выбираю запись без идентификатора (вместо использования уникального идентификатора строки «учетной записи»), я получаю 404.
Конфигурация маршрута:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Частичный вид:
...
<td>
@if (item.ID != null)
{
@Html.ActionLink("Edit", "EditBudget", new { id = item.ID })
}
else if (item.Account != null)
{
@Html.ActionLink("Edit", "EditAccountBudget", new { account = item.Account })
}
</td>
БюджетыКонтроллер:
// POST: Budgets/Edit/5
[Route("edit/{id?}")]
[HttpPost]
public ActionResult EditBudget(int? id = null, FormCollection collection = null)
{
...
// Responding correctly for URL: http://localhost:4007/edit/19
}
[Route("editaccountbudget/{account}")]
[HttpPost]
public ActionResult EditAccountBudget(string account)
{
...
// Getting 404 for URL: http://localhost:4007/editaccountbudget/6000..130
}
Обновлено. Все еще получаю 404.
Попробуйте это [Route("edit/editaccountbudget/{account}")]
Еще 404:localhost: 4007/edit/editaccountbudget/6000..145
@IrishChieftain: Похоже, вы не используете здесь сообщение. Попробуйте удалить атрибут [HttpPost].





Предполагая, что EditBudget — это имя вашего контроллера, вы можете изменить ваш маршрут к этому, чтобы не запутаться (или оставить как есть, поскольку маршрут атрибута будет проигнорирован) и также удалить [POST] из вашего действия:
[Route("~EditBudget/EditAccountBudget/{account}")]
Также измените:
@Html.ActionLink("Edit", "EditAccountBudget", new new { account = item.Account })
К:
@Html.ActionLink("EditAccountBudget", "EditBudget", new { account = item.Account })
Если вы используете элементы управления шаблона Razor Pages, вам необходимо иметь как контроллер, так и часть действия маршрута в соответствии с вашим сопоставлением маршрута. Если вы используете ajax или httpclient, у вас может быть любой синтаксис маршрута.
Любопытно, почему атрибут маршрута игнорируется? Первый параметр ActionLink — это текст этой ссылки, так что это ничего не меняет.
@Html.ActionLink генерирует тег <a> с контроллером и именем действия без маршрутизации.
Вы правы в этом случае, кажется. Но есть возможность передавать маршруты в API, насколько я вижу. Я нашел решение и опубликую ответ.
ActionLink отображает обычный тег привязки (<a />), поэтому он делает только GET, а не POST. Если вы хотите получить значения POST, вам нужно использовать настоящую форму (либо создать собственный тег, либо использовать Html.BeginForm() ), а затем включить в область действия этой формы кнопку отправки.
+1 на ПОЛУЧИТЬ. Это частичный вид. Ссылка приводит пользователя к форме редактирования, которая будет иметь собственный тег формы.
@IrishChieftain: Рад, если это поможет. У меня была такая же проблема в моем приложении.
Ваш BudgetsController должен выглядеть, как показано ниже, без атрибута HttpPost и без атрибута маршрута, поскольку вы используете имена методов в ActionLink. Вы можете использовать атрибут HttpGet, если хотите.
Также нет необходимости в параметре коллекции FormCollection в методе EditBudget. Вы ничего не получите, так как это Get not Post.
public ActionResult EditBudget(int? id = null)
{
}
public ActionResult EditAccountBudget(string account)
{
}
Плюс голосование на GET. В конце концов мне удалось заставить его работать, и я опубликую свой ответ.
Как уже отмечалось, это запрос GET. Если идентификатор был нулевым, мне приходилось передавать модель, потому что для создания запроса к базе данных мне требовалось больше, чем идентификатор учетной записи.
Частичный вид:
@if (item.ID != null)
{
@Html.ActionLink("Edit", "EditBudget", new { id = item.ID })
}
else if (item.Account != null)
{
@Html.ActionLink("Edit", "EditBudget", new { account = item.Account,
SelectedDepartment = item.SelectedDepartment, SelectedYear = item.SelectedYear })
}
БюджетыКонтроллер:
// GET
public ActionResult EditBudget(int? id, BudgetsViewModel model)
{
repo = new BudgetDemoRepository();
if (id != null)
{
// Pass id to repository class
}
else
{
// Pass account and other params to repository class
}
return View(...);
}
[Route("budgets/не совместим с@Html.ActionLink("Edit", наверное.