除日期时间外,每个字段都可以编辑。始终重置为默认值 - 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
将日期发送到服务器,这是<input type="date">
将发送的内容。您可能需要为您的日期使用自定义模型绑定器。
@RichardDeeming 即使我删除注释(或将其设置为yyyy-MM-dd
)并将<input type="text">
更改为<input type="date">
,它也不会更新。
【参考方案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 应用的主要内容,如果未能解决你的问题,请参考以下文章