我正在嘗試將“創建”視圖中的一些輸入傳遞給我的控制器,但 ModelState 回傳錯誤:
控制器:
[Route("Create")]
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([Bind("Name, Location, MaxCapacity")] Warehouse warehouse)
{
if (ModelState.IsValid)
{
_Db.Add(warehouse);
_Db.SaveChanges();
return RedirectToAction("Index");
}
return BadRequest();
}
風景:
@model InventoryManSys.Models.Warehouse
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Warehouse</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Location" class="control-label"></label>
<input asp-for="Location" class="form-control" />
<span asp-validation-for="Location" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="MaxCapacity" class="control-label"></label>
<input asp-for="MaxCapacity" class="form-control" />
<span asp-validation-for="MaxCapacity" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
該模型:
public class Warehouse
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(30, ErrorMessage = "Name should have less than 30 characters")]
[DisplayName("Warehouse Name")]
public string Name { get; set; }
[Required]
public string Location { get; set; }
[Required]
public int MaxCapacity { get; set; }
//Navigation Property
public ICollection<Category> Categories { get; set; }
}
但是當我執行“Console.WriteLine(warehouse.Name)”時,輸入被正確傳遞。如何解決?“bind[]”屬性有問題嗎?
uj5u.com熱心網友回復:
ModelState 無效,但可以訪問表單內容
您可以添加客戶端驗證 js 庫jquery.validate.js和jquery.validate.unobtrusive.js.
檢查這個檔案:
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-6.0#client-side-validation
如果Name//是Location接收MaxCapacity到的值,應該可以正常作業,建議你可以檢查一下ModelState或者只是return BadRequest(ModelState);看看詳細的錯誤是什么。
但是,如果您使用 .NET 6,如本檔案所述:
從 .NET 6 開始,新專案
<Nullable>enable</Nullable>在專案檔案中包含該元素。開啟該功能后,現有的參考變數宣告將變為 不可為空的參考型別。
因此在 ASP.NET 6 中必須要求不可為空的屬性,否則 ModelState 將無效。
一種方法是<Nullable>enable</Nullable>從專案檔案中洗掉。
另一種方法是添加?如下:
public class Warehouse
{
[Key]
public int? Id { get; set; }
[Required]
[StringLength(30, ErrorMessage = "Name should have less than 30 characters")]
[DisplayName("Warehouse Name")]
public string Name { get; set; }
[Required]
public string Location { get; set; }
[Required]
public int MaxCapacity { get; set; }
//Navigation Property
public ICollection<Category>? Categories { get; set; }
}
uj5u.com熱心網友回復:
您的表單缺少控制器中的 [ValidateAntiForgeryToken] 屬性嘗試檢查的防偽令牌。
您可以嘗試在表單中添加防偽令牌行:
@Html.AntiForgeryToken()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494972.html
標籤:C# 网 。网 asp.net-mvc asp.net 核心
