ModelState无效,对象没问题?

时间:2016-12-06 19:52:51

标签: c# asp.net-mvc 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);
    }

显然,由于UserId值为null,根据VS中的调试工具,ModelState.IsValid始终为false。但是,使用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; }
}

我在那里做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:4)

您只在Post中绑定这些值(Url,Homepage,Language,Country,Name),但您的模型根据需要具有Id和UserId。 Model.IsValid设置为绑定时间,该时间是执行控制器操作之前的时间。仅仅因为你在方法中设置了Id和UserId并没有改变模型无效的事实。

答案 1 :(得分:3)

当模型绑定进程发生时,ModelState被设置。 在您的情况下,语句feedModel.UserId = User.Identity.GetUserId();不会更改ModelState。因此,问题。 您可以通过使用验证器等一些不同的机制来检查模型的有效性。 如果您不想使用其他机制,可以设置UserId属性public string UserId { get; set; } = User.Identity.GetUserId();的默认值,或者只需从属性中删除Required属性,以便它不会反映在ModelState中。 / p>