我的控制器無法在提交表單時系結屬性。
這是控制器
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult RegisterUser(RegisterInputModel inputModel)
{
_logger.LogInformation($"email: {inputModel.Email}");
return Redirect("/");
}
這是表格:
<form method="post" asp-route="RegisterUser">
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="RegisterInput.Email"></label>
<input asp-for="RegisterInput.Email" class="form-control" autofocus />
<span asp-validation-for="RegisterInput.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="RegisterInput.Password"></label>
<input asp-for="RegisterInput.Password" class="form-control" />
<span asp-validation-for="RegisterInput.Password" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="RegisterInput.ConfirmPassword"></label>
<input asp-for="RegisterInput.ConfirmPassword" class="form-control" />
<span asp-validation-for="RegisterInput.ConfirmPassword" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
public class RegisterInputModel
{
Required]
EmailAddress]
Display(Name = "Email")]
public string Email { get; set; }
Required]
StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters
long.", MinimumLength = 6)]
DataType(DataType.Password)]
public string Password { get; set; }
DataType(DataType.Password)]
Display(Name = "Confirm password")]
Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
除錯后提交的資料確實通過Request控制器的屬性,但系結失敗。
uj5u.com熱心網友回復:
嘗試在表單標簽下方添加 AntiForgeryToken,或將其從控制器操作中洗掉
<form method="post" asp-route="RegisterUser">
@Html.AntiForgeryToken()
uj5u.com熱心網友回復:
首先,如果您使用asp.net core mvc,則需要更改asp-route="RegisterUser"為asp-action="RegisterUser".
其次,模型系結系統按名稱查看源代碼,asp-for并將在 html 中生成 id 和名稱。所以你可以看到你的名字是這樣的:RegisterInput.PropertyName,它與后端屬性名稱不匹配。您需要添加[Bind(Prefix = "RegisterInput")]特定名稱的前綴,或者您可以RegisterInputModel inputModel將RegisterInputModel RegisterInput.
這是整個作業演示:
模型:
public class YourModel
{
public RegisterInputModel RegisterInput { get; set; }
}
public class RegisterInputModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
查看(索引.cshtml):
@model YourModel
<form method="post" asp-action="RegisterUser"> //change here...
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" ></div>
<div >
<label asp-for="RegisterInput.Email"></label>
<input asp-for="RegisterInput.Email" autofocus />
<span asp-validation-for="RegisterInput.Email" ></span>
</div>
<div >
<label asp-for="RegisterInput.Password"></label>
<input asp-for="RegisterInput.Password" />
<span asp-validation-for="RegisterInput.Password" ></span>
</div>
<div >
<label asp-for="RegisterInput.ConfirmPassword"></label>
<input asp-for="RegisterInput.ConfirmPassword" />
<span asp-validation-for="RegisterInput.ConfirmPassword" ></span>
</div>
<button type="submit" >Register</button>
</form>
控制器:
public class HomeController : Controller
{
//render Index.cshtml view...
public async Task<IActionResult> Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult RegisterUser([Bind(Prefix = "RegisterInput")]
RegisterInputModel inputModel)
//public IActionResult RegisterUser(RegisterInputModel RegisterInput)
{
return Redirect("/");
}
}
啟動.cs:
public class Startup
{
//...
public void ConfigureServices(IServiceCollection services)
{
//....
services.AddControllersWithViews()
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
uj5u.com熱心網友回復:
對于 ASP.Net Core Controller/View(不是 Razor 頁面),我通常使用以下方法,
- 使用空模型查看頁面的 Get 方法
- 使用模型準備表格
- 提交表格
您可以查看以下代碼作為參考
控制器:
[HttpGet]
public IActionResult RegisterUser()
{
var model = new RegisterInputModel();
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult RegisterUser(RegisterInputModel inputModel)
{
_logger.LogInformation($"email: {inputModel.Email}");
return Redirect("/");
}
看法:
@model RegisterInput
<form method="post">
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" ></div>
<div >
<label asp-for="Email"></label>
<input asp-for="Email" autofocus />
<span asp-validation-for="Email" ></span>
</div>
<div >
<label asp-for="Password"></label>
<input asp-for="Password" />
<span asp-validation-for="Password" ></span>
</div>
<div >
<label asp-for="ConfirmPassword"></label>
<input asp-for="ConfirmPassword" />
<span asp-validation-for="ConfirmPassword" ></span>
</div>
<button type="submit" >Register</button>
</form>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/354927.html
