我有一个登录页面,在页面模型中有一个名为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>
我填写了输入字段,然后点击了Submit(表单方法设置为POST
,我OnPost
在页面模型中有一个方法可以处理它),由于某种原因,它LoginDTO.Username
为null,但是LoginDTO.Password
已填充?因此,当然,ModelState是无效的,没有Username
字符串可使用。
怎么会这样?我试过重命名变量并将其设置为value="@Model.LoginDTO.Username"
而不是使用asp-for
,两者都没有任何区别。
有人可以帮忙吗?
更新:我将该Username
属性更改为Email
,它现在开始工作?!为什么这些属性的名称会影响是否可以为其分配值?!?!
我将“用户名”属性更改为“电子邮件”,并且现在可以开始工作了?!为什么这些属性的名称会影响是否可以为其分配值?!?!
首先,您需要知道对于复杂类型的每个属性,模型绑定都会通过源查找名称模式prefix.property_name
。如果未找到任何内容,则仅查找property_name
不带前缀的内容。
参考:
然后,您需要知道asp-for
默认情况下标签帮助程序会生成如下所示的html:
<input id="LoginDTO_Username" name="LoginDTO.Username">
但是您将name
属性添加到输入元素,因此它将覆盖该name
属性,它将呈现html,如下所示:
<input id="LoginDTO_Username" name="email">
因此,模型绑定系统找不到username
源。这就是为什么在将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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句