使用ViewModel进行ASP.NET模型验证

时间:2016-10-11 13:11:39

标签: c# asp.net-mvc model viewmodel

我有一个项目,我可以使用ASP.NET MVC将新闻插入数据库。我所拥有的是NewsModel和NewsViewModel。 Newsmodel在NewsViewModel中声明。

这是我的NewsViewController:

public ActionResult Index(NewsViewModel News)
    {
        //var errors = ModelState.Values.SelectMany(v => v.Errors);

            if (ModelState.IsValid)
            {
                NewsViewRepository NewsRepo = new NewsViewRepository();

                if (NewsRepo.AddNews(News))
                {
                    ViewBag.Message = "News added successfully!";
                    databaseHasChanged = true;
                }
            }


        return View(new NewsViewModel());
    }

这是我的NewsViewModel:

public class NewsViewModel
{


    [Required(ErrorMessage = "First name is required.")]
    public NewsModel news { get; set; }

    public bool isvalid { get; set; } 

    private List<SelectListItem> languageItems= new List<SelectListItem>();


    [Required(ErrorMessage = "Language items requierd")]
    public List<SelectListItem> LanguageItems{get;set;}

    [Required(ErrorMessage = "convetion  requierd")]
    private List<SelectListItem> conventionItems = new List<SelectListItem>();

    [Required(ErrorMessage = "convetion  requierd")]
    public List<SelectListItem> ConventionItems {get; set;}


    public int selectedIndex = 1;
}

所以我遇到的问题是,如果我没有在NewsViewModel中初始化NewsModel,那么ModelState.IsValid总是假的。如果我初始化它总是如此,我没有进入创建视图。它最终出错了。我试图将一个布尔值添加到NewsViewModel以将其设置为true或false并使用它进行检查,但我无法更改View中布尔值的值。我试过这样的话:

@{ Model.isvalid = true }

那么有没有办法在Razor视图中初始化Newsmodel,以便模型状态变为有效? 或者我在这里完全错过了什么?

信息:在我的项目的先前版本中,我没有viewmodel。只有新闻模型,其中只有字符串和整数。它与他们合作..现在唯一的区别是我在NewsViewModel类中有这个NewsModel。

我希望有人可以帮助我。还没有找到任何解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用

查找modelstate的无效属性
foreach (ModelState modelState in ViewData.ModelState.Values) {
    foreach (ModelError error in modelState.Errors) {
        // errors here 
    }
}

答案 1 :(得分:0)

  

视图模型不应包含数据模型。删除它并替换它   具有要在其中显示/编辑的NewsModel的属性   视图。而SelectLists上的[Required]属性则为no   感觉并且总是导致ModelState无效(你不发布   返回SelectList的 -