某些模型属性在 post 上始终为空,模型绑定问题

Some model properties always null on post, modelbinding issue

我正在制作一个网站的一部分,您可以在其中更新您的个人资料。该配置文件与用户相关联,是 Microsoft Identity 的扩展。

问题LastNameFirstName 在发出 post 请求后始终为空。 我想如果这是一个 ModelState 错误,我会通过 !ModelState.IsValid.

发现它

https://i.gyazo.com/eea1e3465427eba5a731947473fca821.mp4

型号

using Microsoft.AspNetCore.Identity;
using System;
namespace Certificate_Wiki.Models {
    public class CertificateUser : IdentityUser {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Website { get; set; }
        public string Occupation { get; set; }
        public string Country { get; set; }
        public string Description { get; set; }
        public String ProfilePictureUrl { get; set; }
        public Byte[] ProfilePicture { get; set; }
        public bool isPrivate { get; set; }
    }
}

cshtml

@{
    ViewData["Title"] = "Edit Profile";
}
@model Certificate_Wiki.Models.CertificateUser
<link rel="stylesheet" href="~/css/pages/ProfileEdit.css" media="all" />

<div class="background"></div>
<div class="content">
    <div class="content-image">
        <img src="~/images/profile/Component 1 – 1.png" alt="" />
    </div>
    <div class="content-profile">
        <div class="profile-image">
            <img src="https://www.pngitem.com/pimgs/m/78-786293_1240-x-1240-0-avatar-profile-icon-png.png" alt="error loading image" />
        </div>
        <div class="profile-form">
            <h2>@User.Identity.Name</h2>
            <div asp-validation-summary="All">
            </div>
            <form asp-action="Edit" method="post">

                <div class="form-row">
                    <label>First Name</label>
                    <input asp-for="FirstName" type="text" name="name" />
                </div>
                <div class="form-row">
                    <label>Last Name</label>
                    <input asp-for="LastName" type="text" name="name" />
                </div>
                <div class="form-row">
                    <label>Occupation</label>
                    <input asp-for="Occupation" type="text" name="occupation" />
                </div>
                <div class="form-row">
                    <label>Website</label>
                    <input asp-for="Website" type="url" name="website" />
                </div>
                <div class="form-row">
                    <label>Country</label>
                    <input asp-for="Country" type="text" name="Country" />
                </div>
                <div class="form-row">
                    <label>Profile Description</label>
                    <textarea asp-for="Description" type="text" name="description"></textarea>
                </div>
                <div class="form-row">
                    <label>Private Profile</label>
                    <input asp-for="isPrivate" type="checkbox" name="Private" />
                </div>

                <div class="form-row">
                    <button type="submit">Save</button>
                </div>
            </form>
        </div>
    </div>
</div>

控制器

[HttpGet]
[Authorize]
[Route("Profile/edit")]
public async Task<IActionResult> EditAsync() 
{
    var Profile = await userManager.FindByEmailAsync(User.Identity.Name);
    if (Profile == null) { return View(); }

    return View(Profile);
}

[ValidateAntiForgeryToken]
[HttpPost]
[Authorize]
[Route("Profile/edit")]
public async Task<IActionResult> EditAsync([FromForm]CertificateUser model) 
{
    //TODO
    //Remove CW from single-line if
    if (!ModelState.IsValid) { Console.WriteLine("Modelstate invalid"); return View(model); }

    var Profile = await userManager.FindByEmailAsync(User.Identity.Name);
    if (Profile == null) { return View(); }

    //Update database
    Profile.FirstName = model.FirstName;
    Profile.LastName = model.LastName;
    Profile.Description = model.Description;
    Profile.Country = model.Country;
    Profile.Occupation = model.Occupation;
    Profile.Website = model.Website;
    await userManager.UpdateAsync(Profile);

    Console.WriteLine("Update success");

    return RedirectToAction("Index");
}

注意,虽然我在做这件事,但我还想问一下是否有 "better" 或一种相当干净的方式来更新用户而无需 profile... = model... 每 属性 更新一次。

如果你对输入框使用asp-for属性,那么你不应该同时使用name属性(或者至少使用相同的值)。

在您的示例中,您为 asp-for 设置了 FirstName,然后仅为 FirstName 输入的名称属性设置了名称。