C# 重写视图模型中的必需属性

C# 重写视图模型中的必需属性,c#,asp.net,asp.net-mvc,viewmodel,C#,Asp.net,Asp.net Mvc,Viewmodel,我有一个视图模型,用于我的网站表示的对象。让我们称之为Student 我很高兴通过对添加、详细信息和编辑视图使用相同的视图模型来最小化应用程序的混乱 但是,某些元素在“编辑”视图中不应可编辑,例如密码。所以我从视图中删除了这些 但是,现在ModelState.IsValid在回发时报告false 是否有一种直接的方法可以对所有这些视图使用相同的视图,但以某种方式覆盖“编辑”视图所需的状态 注意:我意识到我可以使用隐藏字段。但我不喜欢将密码之类的数据发送到客户端并返回。我只是不想在这里公开它。所以

我有一个视图模型,用于我的网站表示的对象。让我们称之为
Student

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

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

但是,现在
ModelState.IsValid
在回发时报告false

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


注意:我意识到我可以使用隐藏字段。但我不喜欢将密码之类的数据发送到客户端并返回。我只是不想在这里公开它。

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

但还有另一种选择。有些东西虽然不完美,但更接近我想要的

表单发回时,所有错误都存储在
ModelState
中。如果您知道存在一些无关紧要的错误,您可以清除这些错误。请注意,清除所有错误将导致
ModelState.IsValid
false
更改为
true

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

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

您是否考虑过创建视图特定的视图模型?根据需要使用继承。属性是编译时元数据,它们对于您的请求不灵活。添加到已经提供的建议之一,创建公共基础视图模型并使属性为虚拟。在视图特定的视图模型中,根据需要覆盖必要的属性并应用必需的属性。@Shyju:是的,我确实考虑过,如果没有更简单的方法,我可能会采用这种方法。但是我很高兴能够最小化所需的模型数量。如果你只剩下臃肿复杂的模型,那么最小化模型并不会让事情变得更简单。在这种情况下,分成不同的模型是更简单的选择。@JMadel:最小化模型如何等同于臃肿和复杂的模型?我会说这两者完全相反。但这会绕过客户端验证吗?@Nkosi:我已经从视图中删除了这些输入字段,所以这对我来说不是问题。如果您的视图仍然有这些字段,那么客户端验证显然仍然会抱怨。这正是我需要的解决方案。我重新使用了一个用于创建和更新的模型,其中某个字段的空值在编辑期间意味着“保留当前值”,但在创建期间是必需的。这允许我避免创建一个包含所有相同字段的模型,但其中只有一个字段不是[必需的],