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 中。