【问题标题】:ASP.Net Core Razor Pages application not binding to property within modelASP.Net Core Razor Pages 应用程序未绑定到模型中的属性
【发布时间】:2020-11-27 06:53:33
【问题描述】:

我有一个登录页面,在页面模型中有一个名为 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,它现在开始工作了吗?!为什么这些属性的名称会影响它们是否可以被赋值?!?!

【问题讨论】:

    标签: asp.net-core razor-pages


    【解决方案1】:

    我将用户名属性更改为电子邮件,现在它开始工作了?!为什么这些属性的名称会影响它们是否可以被赋值?!?!

    首先,您需要知道对于复杂类型的每个属性,模型绑定会在源中查找名称模式prefix.property_name。如果没有找到,它只查找不带前缀的property_name

    参考:

    https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1#complex-types

    那么你需要知道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>
    

    【讨论】:

    • 谢谢 Rena,我没有意识到 asp-for 会自动生成这样的标签,我对 Razor 页面和 Web 开发都很陌生(可能很明显)相对较新,我发现很难找到很多资源。我删除了name 标签并让asp-for 处理它,现在它工作得很好。
    猜你喜欢
    • 2020-02-19
    • 2019-05-10
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多