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

Posted

技术标签:

【中文标题】除日期时间外,每个字段都可以编辑。始终重置为默认值 - MVC ASP.NET Core 3.1 Web 应用【英文标题】:Every singe field can be edited except the DateTime. Always resets to defaut - MVC ASP.NET Core 3.1 Web App 【发布时间】:2022-01-03 19:36:01 【问题描述】:

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

ApplicationUser.cs 类:

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 视图类:

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 类中负责更新用户信息的段:

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>

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

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

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

【问题讨论】:

我怀疑模型绑定器无法理解MM.dd.yyyy 格式。通常希望使用yyyy-MM-dd 将日期发送到服务器,这是&lt;input type="date"&gt; 将发送的内容。您可能需要为您的日期使用自定义模型绑定器。 @RichardDeeming 即使我删除注释(或将其设置为yyyy-MM-dd)并将&lt;input type="text"&gt; 更改为&lt;input type="date"&gt;,它也不会更新。 【参考方案1】:

我看到了问题:您的输入是用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 );

【讨论】:

非常感谢。我看了好几个小时的代码。

以上是关于除日期时间外,每个字段都可以编辑。始终重置为默认值 - MVC ASP.NET Core 3.1 Web 应用的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:初始化重置的默认值

使用 VB6 将 DAO 日期时间字段重置为空

mysql中为一个字段添加default值为当前时间,怎么写

datax日期为空报错

mysql字段默认值不生效的问题解决(上)

使用 mysql 和 php 搜索除日期字段外的整个表