我有一个登录页面,在页面模型中有一个名为LoginDTO的属性(我的自定义类(。其中只有两个字符串——用户名和密码。
在登录页面上,我有一个带有两个字段的登录表单,你可能可以猜到它们是什么。代码在这里:
<div class="form-group">
<input class="form-control" type="email" name="email" placeholder="Email" asp-for="LoginDTO.Username">
</div>
<div class="form-group">
<input class="form-control" type="password" name="password" placeholder="Password" asp-for="LoginDTO.Password">
</div>
我填写输入字段并点击提交(表单方法设置为POST
,我在页面模型中有一个OnPost
方法来处理它(,由于某种原因,LoginDTO.Username
为空,但LoginDTO.Password
已填充??因此,ModelState当然是无效的,并且没有可使用的Username
字符串。
这怎么可能?我尝试过重命名变量并将其设置为value="@Model.LoginDTO.Username"
,而不是使用asp-for
,两者都没有任何区别。
有人能帮忙吗?
更新:我将Username
属性更改为Email
,现在它开始工作了?!为什么这些属性的名称会影响它们是否可以赋值?!?!
我将Username属性更改为Email,现在它开始工作了?!为什么这些属性的名称会影响它们是否可以赋值?!?!
首先,您需要知道,对于复杂类型的每个属性,模型绑定都会查找名称模式prefix.property_name
的源。如果没有找到任何内容,则只查找没有前缀的property_name
。
参考:
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1#复杂类型
然后你需要知道asp-for
标签助手会默认生成如下html:
<input id="LoginDTO_Username" name="LoginDTO.Username">
但是您将name
属性添加到输入元素,因此它将覆盖name
属性,它将呈现如下所示的html:
<input id="LoginDTO_Username" name="email">
因此模型绑定系统找不到CCD_ 15的来源。这就是为什么在将Username
属性更改为Email
之后它可以工作的原因。
对于您的场景,如果您不想更改模型属性名称,您可以更改如下:
<input class="form-control" type="email" name="username" placeholder="Email" asp-for="LoginDTO.Username">
或者只使用asp-for
标签助手:
<div class="form-group">
<input class="form-control" type="email" placeholder="Email" asp-for="LoginDTO.Username">
</div>
<div class="form-group">
<input class="form-control" type="password" placeholder="Password" asp-for="LoginDTO.Password">
</div>