Почему эта модель представления заполняется, когда я передаю "" в RenderAction? - PullRequest
0 голосов
/ 03 сентября 2010

Я пытаюсь реализовать элемент управления 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>

Причина, по которой я хочу загрузить и Search, и Directory, заключается в том, что странице не нужно запрашивать содержимое в зависимости от того, на какой вкладке нажата кнопка.Я хочу, чтобы все это было доступно немедленно.

Проблема, с которой я столкнулся, заключается в том, что если CurrentTab содержит значение "Directory", это означает (я предположил), что Html.RenderAction("SearchBox"... должен передать пустую строку.Но когда дело доходит до метода действия, модель представления, переданная в 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
    }

Оба DirectoryViewModel и SearchViewModel содержат свойство с именем Search

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

ModelBinder будет новый () вверх любой объект в параметрах ActionMethod.Я не думаю, что это поведение может быть отключено без реализации вашего собственного моделя.Вам необходимо создать перегрузку без параметров и соответственно ее направить.

0 голосов
/ 03 сентября 2010

Если вы делаете что-то вроде этого

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

Поскольку третий параметр Html.RenderAction равен object routeValues, это словарь с параметром действия, которое вы вызываете как Key,Если вы не укажете параметр, который вы передаете в параметре routeValues вашего Html.RenderAction, он всегда будет передавать значение object параметру vm вашего действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...