【发布时间】:2014-08-16 03:00:23
【问题描述】:
我对 ASP.NET MVC 非常陌生。我指的是this 答案来解决我的问题。我花了几个小时研究了很多,以找到一种从编辑操作中排除属性的方法。 我使用了数据绑定,但没有运气,我使用视图模型仅包含需要修改的字段,这很有效,但我并不是 100% 满意,因为我正在寻找一种更简单且可重用的方法。我尝试使用 TryUpdateModel() 但我不完全了解如何实现它。
上面的链接看起来是一个完美的解决方案,但不幸的是我仍然遇到同样的验证错误Cannot insert the value NULL into column 'CreatedBy', table 'xxx'; column does not allow nulls. UPDATE fails.
知道为什么吗?非常感谢帮助。
编辑:让我再次清楚地说明我想要什么。我想在我的模型中使用“CreatedBy”,这就是为什么我有一个属性。我不能只是删除它。我不想在视图中使用隐藏字段来传递值,因此它不会为空。我只想要一种从编辑中排除属性的适当而简单的方法。除了使用视图模型之外,还有更好的解决方案吗?
详情:
CreatedBy 是在创建操作时填充的必填字段。
我的视图包含模型中除CreatedBy之外的所有字段的编辑器
我的控制器:
[HttpPost]
[ValidateOnlyIncomingValuesAttribute]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Exclude = "CreatedBy")] Request model)
{
if (ModelState.IsValid)
{
var currentUser = User.Identity.Name;
var emp = db.Employees.SingleOrDefault(e => e.ApplicationUser == db.Users.FirstOrDefault(u => u.UserName.Equals(currentUser)));
if (emp != null)
{
model.ModifiedBy = emp.NIC;
model.ModifiedDate = DateTime.Now;
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
// some code
}
}
我的操作过滤器
public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var modelState = filterContext.Controller.ViewData.ModelState;
var valueProvider = filterContext.Controller.ValueProvider;
var keysWithNoIncomingValue = modelState.Keys.Where(x => !valueProvider.ContainsPrefix(x));
foreach (var key in keysWithNoIncomingValue)
modelState[key].Errors.Clear();
}
}
【问题讨论】:
标签: c# asp.net-mvc validation action-filter