这个问题与这个有关,但我认为在我的示例中,我有可能会改变答案的细节。
假设我在控制器上有一个用户操作,它呈现一个视图以显示有关特定用户的数据,它可能有UserViewModel
这样的:
public class UserViewModel {
public string FirstName;
public string LastName;
etc...
}
但是,在此视图中,除了显示此用户数据外,我还希望为用户提供一个搜索文本框,以便他们可以在此页面上查找另一个用户。此表单将发布到 FindUser 的操作中,该操作接受以下模型:
public class FindUserInputViewModel {
[Required]
public string SearchQuery;
}
如果此操作发现模型无效,它会重定向回 User 操作,维护 ModelState。
现在,目前要显示验证错误,我不能使用强类型帮助器,因为该搜索查询属性不在UserViewModel
,我必须这样做:
@Html.TextBox("SearchQuery")
@Html.ValidationMessageFor("SearchQuery")
这可行,并且将显示错误,以及显示 POST 的旧值(因为它保留在 ModelState 中)。但是,我更愿意尽可能使用强类型的助手。
从我看到的所有示例中,这里的模式似乎是UserViewModel
应该在其中包含 FindUserInputViewModel,也许作为一个FindUserInput
属性。然后我可以这样做:
@Html.TextBoxFor(m => m.FindUserInput.SearchQuery)
这也有效,只要我确保我的 FindUser 操作绑定到正确的前缀,或者我在 TextboxFor 方法调用中指定一个名称。
但是,我真的不明白为什么我的 UserViewModel 应该包含这个其他 ViewModel 只是为了使用这个帮助程序绑定验证。它是否带来了我没有看到的其他好处?如果您的视图模型需要渲染您发布的相同数据,例如在典型的编辑操作中,我理解它的使用,但这里不是这种情况。
在我看来,这里方便的是另一个可以引用不同类型的通用助手,如下所示:
@Html.TextBoxForType<FindUserInput>(m => m.SearchQuery)
这不存在,但我认为我应该能够写出来,这是一个很好的案例。这听起来像是一个合适的解决方案,还是我在这里遗漏了什么?
另一个选择可能是用于发布的小型表单FindUserInputViewModel
应该有自己的 GET 操作以及 POST,然后用户视图可以使用@Html.Action
. 然后它可以渲染一个仅强类型为的局部视图FindUserInputViewModel
。