Поля формы из ASP.NET View отображаются в NULL в контроллере
Поля формы не возвращают значение формы, даже если указаны asp-контроллер и asp-действие. Форма переходит к правильной функции контроллера и возвращает правильное представление, однако это делает объект формы NULL.
@using ActionAugerMVC.Models
@model Tuple<IEnumerable<Cities>,Content,IEnumerable<Content>,Quote>
@addTagHelper "*,Microsoft.AspNetCore.Mvc.TagHelpers"
<div class="sidebar__item">
<p class="subheading">Instant Quote Request</p>
<form class="register__form" role="form" asp-controller="Plumbing" asp-action="QuoteForm" method="post">
<div class="text-danger" asp-validation-summary="All"></div>
<div class="form-group">
<label class="sr-only">Full Name </label>
<input asp-for="@Model.Item4.FullName" type="text" class="form-control" placeholder="Full name">
</div>
<div class="form-group">
<label class="sr-only">Your phone</label>
<input asp-for="@Model.Item4.Phone" type="tel" class="form-control" placeholder="Your phone">
<span asp-validation-for="@Model.Item4.Phone" class="text-danger"></span>
</div>
<div class="form-group">
<label class="sr-only">E-mail</label>
<input asp-for="@Model.Item4.Email" type="email" class="form-control" placeholder="E-mail">
<span asp-validation-for="@Model.Item4.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label class="sr-only">Your Message</label>
<input asp-for="@Model.Item4.Message" type="text" class="form-control" placeholder="Your Message">
</div>
<input type="submit" value="Get a Quote Now" class="btn btn-accent btn-block">
</form>
</div> <!-- .sidebar__item -->
И Контроллер выглядит следующим образом с объектом Quote, равным нулю. Значения в жестком коде правильно отображаются в представлении, но объект Quote, возвращаемый формой, имеет значение null.
[HttpPost]
public IActionResult QuoteForm(Quote quote)
{
if (ModelState.IsValid)
{
/* quote.FullName = "Umar Aftab";
quote.Email = "test@email.com";
quote.City = "Calgary";
quote.Message = "Test Message";
quote.Phone = "6474543769";
*/
}
return View(quote);
}
2 ответа
Проблема заключается в том, что вы используете Tuple в качестве модели вашего представления в сочетании с asp-for
, Например, с чем-то вроде:
<input asp-for="@Model.Item4.FullName" type="text" class="form-control" placeholder="Full name">
Имя входа будет заканчиваться как Item4.FullName
, Тем не менее, ваше действие принимает только Quote
, что означает, что связующему моделю нужно, чтобы вход был назван просто FullName
для того, чтобы связать это правильно. Вам либо нужно принять ту же модель, которую использует представление (хотя я никогда не пытался опубликовать Tuple
поэтому не уверен, что это сработает), или вы можете использовать частичное представление, чтобы обойти проблему.
По сути, вам просто нужно переместить все поля, связанные с просто Quote
к частичному виду. Затем, в этом представлении, вы можете включить их через:
@Html.Partial("_QuoteFields", Model.Item4)
Этого должно быть достаточно для того, чтобы просто назвать поля как FullName
вместо Item4.FullName
, Если это не так, то вам может понадобиться сбросить HtmlFieldPrefix
, с помощью:
@Html.Partial("_QuoteFields, Model.Item4, new ViewDataDictionary(ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "" } })
Модель на вашем представлении отличается от модели, к которой вы пытаетесь привязать ее в контроллере. Вы не собираетесь получить пары ключ / значение, чтобы соответствовать
Поместите свою бритву в частичный вид с Quote
в качестве модели и попробуйте это.
_QuoteForm.cshtml
@model Quote
<div class="form-group">
<label class="sr-only">Full Name </label>
<input asp-for="FullName" type="text" class="form-control" placeholder="Full name">
</div>
<div class="form-group">
<label class="sr-only">Your phone</label>
<input asp-for="Phone" type="tel" class="form-control" placeholder="Your phone">
<span asp-validation-for="Phone" class="text-danger"></span>
</div>
<div class="form-group">
<label class="sr-only">E-mail</label>
<input asp-for="Email" type="email" class="form-control" placeholder="E-mail">
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label class="sr-only">Your Message</label>
<input asp-for="Message" type="text" class="form-control" placeholder="Your Message">
</div>
OriginalView.cshtml
using ActionAugerMVC.Models
@model Tuple<IEnumerable<Cities>,Content,IEnumerable<Content>,Quote>
@addTagHelper "*,Microsoft.AspNetCore.Mvc.TagHelpers"
<div class="sidebar__item">
<p class="subheading">Instant Quote Request</p>
<form class="register__form" role="form" asp-controller="Plumbing" asp-action="QuoteForm" method="post">
<div class="text-danger" asp-validation-summary="All"></div>
@Html.Partial("_QuoteForm", Model.Item4)
<input type="submit" value="Get a Quote Now" class="btn btn-accent btn-block">
</form>
</div> <!-- .sidebar__item -->