ModelState 无效,对象没问题?
ModelState is invalid, object is fine?
我目前正在开发一个基本的 asp.net mvc 应用程序。今天遇到一个奇怪的问题:
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Url, Homepage, Language, Country, Name")]FeedModel feedModel)
{
feedModel.Id = Guid.NewGuid().ToString();
feedModel.UserId = User.Identity.GetUserId();
Debug.WriteLine(feedModel.UserId);
if (ModelState.IsValid)
{
db.Feeds.Add(feedModel);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(feedModel);
}
显然,根据 VS 中的调试工具,由于 UserId 值为空,ModelState.IsValid 始终为假。但是,使用 Debug.WriteLine,feedModel.UserId 会正确显示。
该函数是关于从视图接收信息,添加 Id 和 UserId 的值。
这是 feedModel-class:
public class FeedModel
{
[Key]
public string Id { get; set; }
[Required]
public string UserId { get; set; }
[Required]
public string Url { get; set; }
[Required]
public string Homepage { get; set; }
[Required]
public string Language { get; set; }
[Required]
public string Country { get; set; }
[Required]
public string Name { get; set; }
}
我哪里做错了?
提前致谢!
您仅在 Post 中绑定这些值(Url、主页、语言、国家/地区、名称),但您的模型具有所需的 Id 和 UserId。 Model.IsValid 在绑定时间设置,也就是在您的控制器操作执行之前。仅仅因为您在方法中设置了 Id 和 UserId 并不能改变模型无效的事实。
ModelState 在模型绑定过程发生时设置。
在您的情况下,语句 feedModel.UserId = User.Identity.GetUserId();
不会更改 ModelState。因此,问题。
您可以通过一些不同的机制(例如使用验证器)来检查模型的有效性。
如果您不想使用不同的机制,您可以设置 UserId 属性 public string UserId { get; set; } = User.Identity.GetUserId();
的默认值,或者您可以简单地从 属性 中删除 Required 属性,这样它就不会不会反映在 ModelState 中。
我目前正在开发一个基本的 asp.net mvc 应用程序。今天遇到一个奇怪的问题:
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Url, Homepage, Language, Country, Name")]FeedModel feedModel)
{
feedModel.Id = Guid.NewGuid().ToString();
feedModel.UserId = User.Identity.GetUserId();
Debug.WriteLine(feedModel.UserId);
if (ModelState.IsValid)
{
db.Feeds.Add(feedModel);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(feedModel);
}
显然,根据 VS 中的调试工具,由于 UserId 值为空,ModelState.IsValid 始终为假。但是,使用 Debug.WriteLine,feedModel.UserId 会正确显示。
该函数是关于从视图接收信息,添加 Id 和 UserId 的值。
这是 feedModel-class:
public class FeedModel
{
[Key]
public string Id { get; set; }
[Required]
public string UserId { get; set; }
[Required]
public string Url { get; set; }
[Required]
public string Homepage { get; set; }
[Required]
public string Language { get; set; }
[Required]
public string Country { get; set; }
[Required]
public string Name { get; set; }
}
我哪里做错了?
提前致谢!
您仅在 Post 中绑定这些值(Url、主页、语言、国家/地区、名称),但您的模型具有所需的 Id 和 UserId。 Model.IsValid 在绑定时间设置,也就是在您的控制器操作执行之前。仅仅因为您在方法中设置了 Id 和 UserId 并不能改变模型无效的事实。
ModelState 在模型绑定过程发生时设置。
在您的情况下,语句 feedModel.UserId = User.Identity.GetUserId();
不会更改 ModelState。因此,问题。
您可以通过一些不同的机制(例如使用验证器)来检查模型的有效性。
如果您不想使用不同的机制,您可以设置 UserId 属性 public string UserId { get; set; } = User.Identity.GetUserId();
的默认值,或者您可以简单地从 属性 中删除 Required 属性,这样它就不会不会反映在 ModelState 中。