1

这个问题与这个有关,但我认为在我的示例中,我有可能会改变答案的细节。

假设我在控制器上有一个用户操作,它呈现一个视图以显示有关特定用户的数据,它可能有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

4

1 回答 1

0

为什么不为您的搜索创建一个局部视图并简单地FindUserInputViewModel从您的用户视图中传递一个新视图?

@Html.Partial("FindUser", new FindUserInputViewModel())

您可以FindUserInputViewModel在其中键入部分视图并使用强类型帮助器。我会说这是最简单和最整洁的方法,除非我遗漏了什么?

于 2012-11-28T20:57:17.557 回答