当我将“”传递给RenderAction时,为什么要填充此视图模型?

时间:2010-09-02 23:28:04

标签: c# asp.net-mvc renderaction actionmethod

我正在尝试实现系统中每个页面上存在的Widget控件,这将允许用户具有基本的搜索和放大器。每页上可用的目录功能。这是下面定义的选项卡控件,其中<ul>当前选中的选项卡由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包含值“Directory”,这意味着(我假设)Html.RenderAction("SearchBox"...应该传入一个空字符串。但是当它进入action方法时,传入SearchBox的视图模型包含一个值,而不是""

我不明白为什么会这样。即使我将空字符串传递给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
    }

DirectoryViewModelSearchViewModel都包含名为Search

的属性

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你应该做这样的事吗

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

由于Html.RenderAction的第三个参数是object routeValues,这是一个带有您要调用的Key的Action参数的字典。如果您未在routeValues的{​​{1}}参数中指定要传递的参数,则会始终将Html.RenderAction值传递给您的操作的object参数。