ASP.NET视图中的表单字段在Controller中显示为NULL

时间:2017-09-28 17:06:26

标签: c# asp.net asp.net-mvc asp.net-core-mvc-2.0

即使声明了asp-controller和asp-action,表单字段也不会返回表单的值。  表单确实转到右侧控制器函数并返回正确的视图,但是,表单对象是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 -->

Controller看起来像这样,Quote对象为null。 硬编码值在视图中正确显示,但表单返回的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 个答案:

答案 0 :(得分:0)

您的视图上的模型与您尝试将其绑定到控制器中的模型不同。您无法获得匹配的键/值对

将您的剃刀放在部分视图中,并以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 -->

答案 1 :(得分:0)

问题是您使用元组作为视图的模型与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