加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 不使用DropDownList和嵌套对象的ModelState验证

发布时间:2020-12-16 06:26:18 所属栏目:asp.Net 来源:网络整理
导读:在我们的应用程序中,我们有一个Domain层,其中包含带有DataAnnotations for Validation的类. 我们在ASP.NET MVC ui层中的模型中使用这些类. 例如: 域层: public class Company{ public int Id { get; set; } [Required] [StringLength(50)] public string D
在我们的应用程序中,我们有一个Domain层,其中包含带有DataAnnotations for Validation的类.

我们在ASP.NET MVC ui层中的模型中使用这些类.

例如:

域层:

public class Company
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Description { get; set; }

    // ... some model logic abreviated
}

public class Supplier 
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public Company Company { get; set; }

    // ... some model logic abreviated
}

在我们的ASP.NET MVC表示层中:

public class SupplierEditModel
{
    public Supplier Supplier { get; set; }
    public IEnumerable<Company> Company { get; set; }
    public int SelectedCompany { get; set; }

    // ... some model logic abreviated
}

在这种情况下,我们有一个包含公司DropDownList的页面.列表是这样绑定的:

@Html.DropDownListFor(m => m.SelectedCompany,new SelectList(Model.Companies,"Id","Description",Model.SelectedCompany))

我们的问题出在控制器的POST方法上,当我们检查ModelState.IsValid时,模型无效,因为Supplier.Company为null.然后我们可以使用SelectedCompany来获取公司,但我们的问题是,这意味着我们不能做这样的事情:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(SupplierEditModel model)
{
    if (ModelState.IsValid)
    {
        model.CreateSupplier(_supplierService);
        return RedirectToAction("Index");
    }

    return RedirectToAction("Create");
}

我们想在创建供应商之前使用验证.

解决方法

我看到你有(至少)两个选择:

如果视图中不需要,您可以展平视图模型并省略Supplier.Company.

public class SupplierEditModel
{
    public int SupplierId { get; set; }
    public string Name { get; set; }
    public Company Company { get; set; }
    public IEnumerable<Company> Company { get; set; }
    public int SelectedCompany { get; set; }

    // ... some model logic abreviated
}

(注意:您的数据注释应该在视图模型上,而不是域模型.)

要么

您可以在检查IsValid属性之前清除ModelState错误

ModelState.Remove(string key,ModelState);

这里的最佳做法可能是使用扁平模型,原因有两个.首先,通常只是发送视图所需的内容而不是更好的做法.如果视图没有对Supplier.Company执行任何操作,则它不应该是模型的一部分.二,使用ModelState.Remove方法虽然有效,但有些人可能会认为它是一个小小的kludgy.您可能会在代码审查中稍微破坏您的印章;)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读