[英]Form fields from the ASP.NET View appear NULL in the Controller
即使聲明了 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 -->
控制器看起來像這樣,引用對象為空。 硬編碼的值在視圖中正確顯示,但表單返回的 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);
}
您視圖上的模型與您嘗試將其綁定到控制器中的模型不同。 你不會讓鍵/值對匹配
以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>
原始視圖.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)
這應該足以讓 Razor 出足夠的名字來命名像FullName
這樣的字段而不是Item4.FullName
。 如果不是,那么您可能需要通過以下方式重置HtmlFieldPrefix
:
@Html.Partial("_QuoteFields, Model.Item4, new ViewDataDictionary(ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "" } })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.