【问题标题】:ASP.NET Model validation with ViewModel使用 ViewModel 进行 ASP.NET 模型验证
【发布时间】:2017-02-20 01:02:19
【问题描述】:

我有一个项目,我可以在其中使用 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 并用它进行检查,但我无法更改视图中布尔值的值。我试过这样:

@{ Model.isvalid = true }

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

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

我希望有人可以帮助我。还没找到解决办法。

【问题讨论】:

  • 为什么要将模型作为视图模型的一部分?
  • 这就是我理解老师解释的方式。他说我可以制作一个视图模型,只需将旧模型添加到其中
  • 不,它没有重复,我已经找到了这个网站。但我有一个稍微不同的问题,找不到任何解决方案,我将在 10 分钟内添加一些屏幕截图以更好地说明它
  • imgur.com/a/4urqN 所以由于某种原因我无法将布尔值设置为 true..

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


【解决方案1】:

您可以使用

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

【讨论】:

  • 我已经知道我的错误是什么了。问题是 NewsViewModel.news = null。那是因为 Modelstate.isvalid 总是返回 false。就像我说的,如果我直接在模型中初始化它,它总是正确的。但它必须是假的,并且在我在视图中插入值之后它需要是真的
  • 好吧,我认为你不应该按要求标记新闻字段。
  • 是的,因为它的类类型。
  • 它是必需的,因为没有它我无法将新闻添加到数据库中
  • 根据我的阅读,验证适用于属性。因此,如果 News 为 null 并且是必需的,那么您的 viewModel 就没有机会有效。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多