ASP.Net Core Razor Pages应用程序未绑定到模型内的属性



我有一个登录页面,在页面模型中有一个名为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>

最新更新