由于某种原因,当我使用子属性作为值时asp-for
,HTTPPost
模型属性显示它们未被修改,并且我的ModelState
验证不会触发。
以下是示例 - 查看
@model ViewModel
<form asp-action="Login" asp-controller="App" method="POST">
<input asp-for="subClass1.user.email_addr" type="text" class="form-control" autocomplete="on" />
<input asp-for="test" type="text" class="form-control" autocomplete="on" />
</form>
模型
public class ViewModel
{
public string test { get; set; } = "test value";
public User subClass1 = new User();
}
public class User
{
public UserL user { get; set; } = new UserL();
}
public class UserL
{
[CustomEAttribute]
public string? email_addr { get; set; }
}
HTTPPOST
方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(ViewModel model, Microsoft.AspNetCore.Http.IFormCollection collection)
{
// I've also found ModelState is not triggered on subClass1
// properties... only the 'test' property triggered.
if (!ModelState.IsValid)
{
}
}
据我在控制器中所知,该属性ViewModel model
没有改变(即没有返回我的视图输入值)email_addr
。
我曾尝试使用@Html.TextBoxFor
纯 html 输入,但仍然没有成功。
网上有很多例子表明你应该能够毫无问题地完成我上面的示例,所以不确定我的代码出了什么问题。
我确实知道Microsoft.AspNetCore.Http.IFormCollection
集合属性确实显示subClass1.user.email_addr
已设置。那么为什么在“模型”中访问相同的值不起作用?
在 ASP.NET MVC 中定义数据模型时,必须使用属性而不是字段。如果使用字段,MVC 引擎将无法正确进行数据绑定。将视图模型声明更改为: