Поля формы из 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 -->
Другие вопросы по тегам