Я создаю страницу контактов, которая находится за пределами каких-либо областей, но когда я использую помощник @Html.BeginForm
, он продолжает добавлять имя одной из моих областей.
Мой контроллер находится в /contact/index
public class ContactController : Controller
{
public IActionResult Index()
{
var contactForm = new ContactFormViewModel();
return View(contactForm);
}
[HttpPost]
public IActionResult SendEmail(ContactFormViewModel contactFormInfo)
{
// send email code
return View();
}
}
Мой Index
вид для контакта:
@model ContactFormViewModel
@{
ViewData["Title"] = "Contact";
ViewData["PageName"] = "contact_index";
ViewData["Heading"] = "<i class='fal fa-info-circle'></i> Contact";
ViewData["PageDescription"] = "Please reach out and let us know how you're doing";
}
<div class = "fs-lg fw-300 p-5 bg-white border-faded rounded mb-g">
@using (@Html.BeginForm("SendEmail", "Contact", new { area = "" }))
{
// Name
<div class = "form-group">
@Html.LabelFor(x => x.FirstName, "First Name")
@Html.TextAreaFor(x => x.FirstName, new { @class = "form-control" })
</div>
// Email
<div class = "form-group">
@Html.LabelFor(x => x.Email, "Email")
@Html.TextAreaFor(x => x.Email, new { @class = "form-control" })
</div>
// Category
<div class = "form-group">
@{
var list = new List<SelectListItem>()
{
new SelectListItem("Common", ContactFormViewModel.InquiryType.Common.ToString()),
new SelectListItem("Question", ContactFormViewModel.InquiryType.Question.ToString()),
new SelectListItem("Error", ContactFormViewModel.InquiryType.Error.ToString()),
new SelectListItem("Advertising", ContactFormViewModel.InquiryType.Advertising.ToString()),
new SelectListItem("Other", ContactFormViewModel.InquiryType.Other.ToString()),
};
}
@Html.LabelFor(x => x.ContactType, "Contact Type")
@Html.DropDownListFor(x => x.ContactType, list, new { @class = "form-control"})
</div>
// Body
<div class = "form-group">
@Html.LabelFor(x => x.Message, "Message")
@Html.TextAreaFor(x => x.Message, new { @class = "form-control" })
</div>
// Submit
<button type = "submit" class = "btn btn-primary">Submit</button>
}
</div>
Нажатие «Отправить» всегда публикует обратно: /fantasyfootball/Contact/SendEmail
<form action = "/fantasyfootball/Contact/SendEmail" method = "post"></form>
Не уверен, что это имеет значение, но вот моя конфигурация маршрута startup.cs:
// Route for printable sheets since they have the /cheatsheet/ static portion
endpoints.MapControllerRoute(
name: "FantasyFootballPrintable",
pattern: "{area:exists}/{controller=printable}/cheatsheet/{action=index}");
// The generic route for the Fantasy Football Route
endpoints.MapControllerRoute(
name: "FantasyFootball",
pattern: "{area:exists}/{controller=cheatsheet}/{action=custom}/{id?}");
// Setting the default route in the area
endpoints.MapControllerRoute(
name: "DefaultFantasyFootball",
pattern: "{area=fantasyfootball}/{controller=cheatsheet}/{action=custom}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=HtmlHelper}/{action=Index}/{id?}");
Вы можете поставить конечную точку default
вверху. Собственно, раньше DefaultFantasyFootball
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=HtmlHelper}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "FantasyFootballPrintable",
pattern: "{area:exists}/{controller=printable}/cheatsheet/{action=index}");
// The generic route for the Fantasy Football Route
endpoints.MapControllerRoute(
name: "FantasyFootball",
pattern: "{area:exists}/{controller=cheatsheet}/{action=custom}/{id?}");
// Setting the default route in the area
endpoints.MapControllerRoute(
name: "DefaultFantasyFootball",
pattern: "{area=fantasyfootball}/{controller=cheatsheet}/{action=custom}/{id?}");
Вы можете использовать метод BeginRouteForm вместо метода BeginForm. Он сгенерирует ссылку действия:
form action="/Contact/SendEmail" method="post"
Вот образец. Надеюсь помочь, дружище :))
@model MvcCore5.ViewModels.ContactFormViewModel
@{
}
<div class = "fs-lg fw-300 p-5 bg-white border-faded rounded mb-g">
@using (Html.BeginRouteForm(
routeName: "default",
method: FormMethod.Post,
routeValues: new { action = "SendEmail", controller = "Contact", area = "" }
))
{
// Name
<div class = "form-group">
@Html.LabelFor(x => x.FirstName, "First Name")
@Html.TextAreaFor(x => x.FirstName, new { @class = "form-control" })
</div>
// Email
<div class = "form-group">
@Html.LabelFor(x => x.Email, "Email")
@Html.TextAreaFor(x => x.Email, new { @class = "form-control" })
</div>
// Body
<div class = "form-group">
@Html.LabelFor(x => x.Message, "Message")
@Html.TextAreaFor(x => x.Message, new { @class = "form-control" })
</div>
// Submit
<button type = "submit" class = "btn btn-primary">Submit</button>
}
</div>
Это решение сработало. Похоже, помощник использует первый неигнорируемый маршрут для создания ссылок. Если окажется, что изменение порядка маршрутов мешает моей существующей навигации, мне придется использовать BeginRouteForm, как предложил @Tomato32.