【问题标题】:MVC 4 Conditional Model Validation with Entity Framework使用实体框架进行 MVC 4 条件模型验证
【发布时间】: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


【解决方案1】:

根据您想要从数据库中填充模型的 cmets,然后对其进行验证(因为其旧数据可能无效),但不会根据 OwnOrRent 的值显示 HomeValuePurchasePrice 的错误, 这种情况下需要先调用TryValidateModel,然后删除ModelState错误

var viewAddressModel = new Address();
.... // set values
if (!TryValidateModel(viewAddressModel))
{
  if (model.OwnOrRent != "1" || model.OwnOrRent != "9")
  {
    if (ModelState.ContainsKey("HomeValue"))
    {
      ModelState["HomeValue"].Errors.Clear();
    }
    if (ModelState.ContainsKey("PurchasePrice"))
    {
      ModelState["PurchasePrice"].Errors.Clear();
    }
  }
}

您现在可以使用if (ModelState.IsValid) 检查是否有任何其他验证错误并返回相应的视图

旁注:我刚刚使用了与 OwnOrRent 值相关的 if 条件,但我怀疑你真正想要的是

if (!(model.OwnOrRent == "1" || model.OwnOrRent == "9"))

【讨论】:

  • 谢谢,我已经尝试了你的代码,我仍然得到部分视图,因为 TryValidateModel 仍然无效,我可以看到错误已删除,但由于返回了部分视图,所以返回错误消息。
  • 有没有办法更新模型状态,并可能在错误消除后重试 TryValidateModel?
  • 您的意思是您收到属性HomeValue 的错误吗?你真的在打ModelState["HomeValue"].Errors.Clear(); 行吗?正如我所指出的,我认为您的 if (model.OwnOrRent != "1" || model.OwnOrRent != "9") 不正确。
  • 不,你不能再次使用TryValidateModel,这只会添加你刚刚删除的错误,所以它有点毫无意义。
  • 是的,代码命中了您添加的行,我可以看到最初 HomeValue 有 1 个错误计数,在代码移动到 HomeValue 后有 0 个错误计数,但是作为行 `return PartialView ("地址", viewAddressModel);' TryValidateModel 中仍然存在检查局部视图渲染,因此重新出现 HomeValue 和 PurchasePrice 的错误。
【解决方案2】:

有一个关于进行条件验证的不同选项的线程: ASP.NET MVC Conditional validation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多