我目前正在开发一个基本的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; }
}
我在那里做错了什么?
提前致谢!
答案 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>