【发布时间】:2012-11-16 19:52:23
【问题描述】:
这个问题与this one 有关,但我认为在我的示例中我有可能会改变答案的细节。
假设我在控制器上有一个用户操作,它呈现一个视图以显示有关特定用户的数据,它可能有一个 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 的局部视图。
【问题讨论】:
标签: c# .net asp.net-mvc asp.net-mvc-4 strong-typing