【发布时间】:2015-07-31 00:22:46
【问题描述】:
是否可以在 ViewModel 上设置条件,其中数据等于实体框架内一个字段中的特定值,在 ViewModel 上使用 TryValidateModel 之前从 ViewModel 中删除所需的元素或整个对象?
我想从 OwnOrRent (model.OwnOrRent) 不等于 1 或 9 的模型验证中删除 HomeValue 和 PurchasePrice。
Model.cs
public class Address
{
public int Id { get; set; }
[DisplayName("House Name or Number")]
[StringLength(50)]
public string HouseNameOrNumber { get; set; }
[DisplayName("Post Town")]
[StringLength(50)]
public string PostTown { get; set; }
[Required(ErrorMessage = "Own or Rent is Required")]
[DisplayName("Own or Rent")]
[StringLength(50)]
public string OwnOrRent { get; set; }
[Required(ErrorMessage = "Mortgage/Rent Amount is Required")]
[DisplayName("Mortgage/Rent Amount")]
[StringLength(50)]
public string MortgageRent { get; set; }
[Required(ErrorMessage = "Home Value is Required")]
[DisplayName("Home Value")]
[StringLength(50)]
public string HomeValue { get; set; }
[Required(ErrorMessage = "Purchase Price is Required")]
[DisplayName("Purchase Price")]
[StringLength(50)]
public string PurchasePrice { get; set; }
}
HomeController.cs
public ActionResult Application(int id)
{
var viewAddressModel = new Address();
using (
var dbEntities = new DbEntities(new EntityConnection(_df.DbEntities)))
{
var model = dbEntities.Applications.Single(e => e.Id == id);
viewAddressModel.Id = Id;
viewAddressModel.HouseNameOrNumber = model.HouseNameOrNumber;
viewAddressModel.PostTown = model.PostTown;
viewAddressModel.OwnOrRent = GetStatus(model.OwnOrRent);
viewAddressModel.MortgageRent = model.MortgageRent.ToString();
viewAddressModel.HomeValue = model.HomeValue;
viewAddressModel.PurchasePrice = model.PurchasePrice;
if (model.OwnOrRent != "1" || model.OwnOrRent != "9")
{
ModelState.Remove("HomeValue");
ModelState.Remove("PurchasePrice");
}
if (!TryValidateModel(viewAddressModel))
{
return PartialView("Address", viewAddressModel);
}
}
var vm = new ApplicationViewModel { Item = CreateApp(id) };
return PartialView("Application", vm);
}
如您所见,我尝试使用 ModelState.Remove 但这没有效果。
如有任何帮助,我们将不胜感激?
【问题讨论】:
-
真的要删除吗?或者您希望将它们排除在验证之外...
-
ModelState.Remove("HomeValue");中没有任何意义 - 此时ModelState中没有任何值。为什么在 GET 方法中调用TryValidateModel?我建议您对ModelState进行一些研究,以了解它是什么以及它是如何工作的。 -
TryValidateModel 的原因是重新检查在 MVC 之前和我参与之前存储的旧数据,以确保将任何问题(例如丢失数据)呈现给请求数据以解决问题并在之前纠正的用户继续申请。
-
至于删除,我希望关闭验证,当 model.OwnOrRent 不是 1 或 9 时,因为 HomeValue 或 PurchasePrice 不存在数据,因为它不是必需的。
标签: c# entity-framework validation asp.net-mvc-4