除日期时间外,每个单独的字段都可以编辑。始终重置为默认值 - MVC ASP.NET Core 3.1 Web App

Every singe field can be edited except the DateTime. Always resets to defaut - MVC ASP.NET Core 3.1 Web App

我正在创建 MVC ASP.NET 核心 3.1 Web 应用程序。请找到代码....

ApplicationUser.cs class:

public class ApplicationUser : IdentityUser
{
    ...

    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [Display(Name = "Date Of Birth")]
    public DateTime DateOfBirth { get; set; }

    public string Country { get; set; }
}

ProfileModel.cs 查看 class:

public class ProfileModel
{
    ...

    public string FirstName { get; set; }

    public string LastName { get; set; }

    [DisplayFormat(DataFormatString = "{0:MM.dd.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime DateOfBirth { get; set; }

    public string Country { get; set; }
}

来自 AppUserService.cs class 负责更新用户信息的部分:

public async Task UpdateUserInfo(string id, string firstName, string lastName, string email, DateTime birthDate, string country)
    {
        var user = GetById(id);
        user.Email = email;
        user.FirstName = firstName;
        user.LastName = lastName;
        user.DateOfBirth = birthDate;
        user.Country = country;
        _context.Update(user);
        await _context.SaveChangesAsync();
    }

片段来自 ProfileController.cs:

[HttpPost]
    public async Task<IActionResult> EditUser(string firstName, string lastName, string email, DateTime birthDate, string country)
    {
        var userId = _userManager.GetUserId(User);

        await _userService.UpdateUserInfo(userId, firstName, lastName, email, birthDate, country);

        return RedirectToAction("Detail", "Profile", new { id = userId });
    }

在视图Detail.cshtml中有一个显示出生日期的部分

<dt>Date of birth:/dt>
<dd>
    Html.DisplayFor(x => Model.DateOfBirth)
</dd>

这是模态中的出生日期编辑部分window

<div class="ProfileInput">
    <input type="text" asp-for="DateOfBirth" placeholder=" " />
    <div class="ProfileInputUnderline"></div>
    <label>Date of Birth</label>
</div>

如下图所示,我可以编辑除 DateOfBirth 之外的所有属性。每个 属性 都会更新,但 DateOfBirth 总是重置为默认值。 我错过了什么?非常感谢您的帮助。

我看到了问题:您的输入是用 asp-for="DateOfBirth" 定义的,但是您的操作参数称为 birthDate

快速而简单的解决方案是重命名您的操作参数:

[HttpPost]
public async Task<IActionResult> EditUser(string firstName, string lastName, string email, DateTime dateOfBirth, string country)
{
    var userId = _userManager.GetUserId(User);

    await _userService.UpdateUserInfo(userId, firstName, lastName, email, dateOfBirth, country);

    return RedirectToAction("Detail", "Profile", new { id = userId });
}

更好的选择是将您的 POST 方法更改为采用 ProfileModel 参数,这将防止此类不匹配再次发生:

[HttpPost]
public async Task<IActionResult> EditUser(ProfileModel model)
{
    var userId = _userManager.GetUserId(User);

    await _userService.UpdateUserInfo(userId, model.FirstName, model.LastName, model.Email, model.DateOfBirth, model.Country);

    return RedirectToAction("Detail", "Profile", new { id = userId });
}