0

我正在尝试实现一个存在于系统中每个页面上的 Widget 控件,这将允许用户在每个页面上都有基本的搜索和目录功能。这是下面定义的选项卡控件,其中<ul>当前选定的选项卡由 in 的值确定,Model.CurrentTab而我要显示的相应内容(基本上,使其可见)也由该值确定。

<div class="WidgetControl">

    <ul class="WidgetTab tabs">
        <li <%= (Model.CurrentTab == "Search") ? "class='active'" : "" %>>
            <span href='<%= Url.Action("SearchBox", "Search") %>'>Search</span>
        </li>

        <li <%= (Model.CurrentTab == "Directory") ? "class='active'" : "" %>>
            <span href='<%= Url.Action("DirectoryList", "Group") %>'>Directory</span>
        </li>
    </ul>

    <div id="Search" class="tab_container">
        <% Html.RenderAction("SearchBox", "Search"
                    , (Model.CurrentTab == "Search") ? Model.Search : ""); %>
    </div>

    <div id="Directory" class="tab_container">
        <% Html.RenderAction("DirectoryList", "Group"
                    , (Model.CurrentTab == "Directory") ? Model.Search : ""); %>
    </div>
</div>

我想同时加载两者的原因SearchDirectory页面不必根据单击的选项卡来请求内容。我希望这一切都立即可用。

我遇到的问题是,如果CurrentTab包含值“目录”,这意味着(我假设)Html.RenderAction("SearchBox"...应该传入一个空字符串。但是当它到达 action 方法时,传入的 View ModelSearchBox包含一个值而不是""

我不明白为什么会这样。即使我将一个空字符串传递给SearchBox,视图模型仍然包含一个值。有人可以解释发生了什么吗?我应该以不同的方式做这件事吗?

更新:

    public PartialViewResult DirectoryList(DirectoryViewModel vm)
    {
        return PartialView(vm.Search); // this is expecting a string
    }

    public PartialViewResult SearchBox(SearchViewModel vm)
    {
        return PartialView(vm); // the among other things, the Search string is used
    }

两者都DirectoryViewModel包含SearchViewModel一个名为Search

4

2 回答 2

1

ModelBinder 将 new() 更新 ActionMethod 参数中的任何对象。我认为如果不实现您自己的 modelbidner 就无法关闭此行为。您需要创建一个没有参数的重载并相应地对其进行路由。

于 2010-09-03T02:07:20.690 回答
0

你应该做这样的事情

 <% Html.RenderAction("SearchBox", "Search", 
                    new { vm = ((Model.CurrentTab == "Search") ? Model.Search : "") }); %>

由于 is 的第三个参数Html.RenderActionobject routeValues一个带有 Action 参数的字典,因此您将其调用为Key. 如果您没有指定要在您的routeValues参数中传递的参数,Html.RenderAction它将始终将一个object值传递给vm您的 Action 的参数。

于 2010-09-03T00:39:03.470 回答