【问题标题】:Overriding Required attribute in view model覆盖视图模型中的必需属性
【发布时间】:2017-03-26 18:09:55
【问题描述】:

我有一个视图模型,用于由我的网站表示的对象。我们就叫它Student吧。

我很高兴通过对添加、详细信息和编辑视图使用相同的视图模型来最大程度地减少应用程序的混乱。

但是,某些元素不应在编辑视图中进行编辑,例如密码。所以我从视图中删除了这些。

但是,现在ModelState.IsValid 在回发时报告错误。

是否有一种直接的方法可以为所有这些视图使用相同的视图,但以某种方式覆盖我的编辑视图所需的状态?

注意:我意识到我可以使用隐藏字段。但是我不习惯向客户端发送密码等数据并返回。我只是不想在这里公开它。

【问题讨论】:

  • 您是否考虑过创建特定视图视图模型?根据需要使用继承。
  • 属性是编译时元数据,它们对于您的请求并不灵活。添加到已经提供的建议之一,创建一个通用的基本视图模型并具有虚拟属性。在视图特定的视图模型中,覆盖必要的属性并根据需要应用所需的属性。
  • @Shyju:是的,我确实考虑过这一点,如果没有更简单的方法,我可能会采用这种方法。但我很高兴能最大限度地减少所需模型的数量。
  • 如果您留下臃肿而复杂的模型,那么最小化模型并不会让事情变得更简单。在这种情况下,拆分成不同的模型是更简单的选择。
  • @JMadel:最小化模型如何等同于臃肿和复杂的模型?我想说两者是完全相反的。

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


【解决方案1】:

因此,正如其他人所指出的,这种情况通常需要不同的视图模型类。并且这可以使用继承更简洁地完成。

但还有另一种选择。虽然不完美,但与我所寻找的更接近。

当您的表单回发时,所有错误都存储在ModelState 中。如果您知道有些错误无关紧要,您可以清除这些错误。注意清除所有错误会导致ModelState.IsValidfalse变为true

public ActionResult Edit(TrainerModel model)
{
    ModelState[nameof(model.Email)]?.Errors?.Clear();
    ModelState[nameof(model.Password)]?.Errors?.Clear();

    if (ModelState.IsValid)
    {
        //
    }
    return View(model);
 }

【讨论】:

  • 但这会绕过客户端验证吗?
  • @Nkosi:我已经从我的视图中删除了这些输入字段,所以这对我来说不是问题。如果您的视图仍然有这些字段,那么显然客户端验证仍然会抱怨。
  • 这正是我需要的解决方案。我正在重新使用模型进行创建和更新,其中某些字段的空值在编辑期间意味着“保留当前值”,但在创建期间是强制性的。这使我可以避免创建具有所有相同字段但只有一个字段不是 [必需] 的模型,
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多