ASP.NET 视图中的表单字段在控制器中显示为 NULL
Form fields from the ASP.NET View appear NULL in the Controller
表单字段没有 return 表单的值,甚至认为 asp-controller 和 asp-action 被声明。
表单确实转到了正确的控制器函数并且 return 是正确的视图,但是,它确实使表单对象为 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。
硬编码的值在视图中正确显示,但由表单 return 编辑的 Quote 对象为空。
[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);
}
您视图中的模型与您尝试将其绑定到控制器中的模型不同。你不会得到 key/value 对来匹配
以 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 -->
问题是您使用元组作为视图的模型并结合 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 = "" } })
表单字段没有 return 表单的值,甚至认为 asp-controller 和 asp-action 被声明。 表单确实转到了正确的控制器函数并且 return 是正确的视图,但是,它确实使表单对象为 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。 硬编码的值在视图中正确显示,但由表单 return 编辑的 Quote 对象为空。
[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);
}
您视图中的模型与您尝试将其绑定到控制器中的模型不同。你不会得到 key/value 对来匹配
以 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 -->
问题是您使用元组作为视图的模型并结合 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 = "" } })