代码之家  ›  专栏  ›  技术社区  ›  DaveDev

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

  •  0
  • DaveDev  · 技术社区  · 14 年前

    我正在尝试实现一个小部件控件,该控件存在于系统中的每个页面上,它允许用户在每个页面上具有基本的搜索和目录功能。这是下面定义的选项卡控件,其中 <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>
    

    我想两者都加载的原因 Search Directory 因此,页面不必根据单击的选项卡请求内容。我希望一切都能立即得到。

    我的问题是如果 CurrentTab 包含值“directory”,这意味着(我假定) Html.RenderAction("SearchBox"... 应传入空字符串。但当它到达action方法时,视图模型传递到 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 包含一个名为 搜索

    2 回复  |  直到 14 年前
        1
  •  1
  •   John Farrell    14 年前

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

        2
  •  0
  •   rob waminal    14 年前

    你应该这样做吗

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

    因为第三个参数 Html.RenderAction object routeValues 这是一个字典,其中包含您作为 Key . 如果不指定要传入的参数, routeValues 您的参数 HTML.renderAction 它总是通过 object 价值到 vm 动作的参数。

    推荐文章