Почему действие моего контроллера не вызывается после повторного нажатия кнопки? - PullRequest
0 голосов
/ 17 мая 2010

Сначала немного кода:

Вот начальное действие, которое вызывается при переходе на страницу:

public ActionResult ListCodeTypes()
{
    var CodeList = _entities.Master_Codes.ToList();

    List<SelectListItem> items = new List<SelectListItem>();
    for (int i = 0; i < CodeList.Count; i++)
    {
        items.Add(new SelectListItem { 
            Text = CodeList[i].description, 
            Value = CodeList[i].code_table_name 
        });
    }

    ViewData["items"] = items;
    return View("CodesAdmin");
}

Вот страница Aspx CodesAdmin / код просмотра:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
CodesAdmin
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% Html.RenderPartial("subMenu/ParcelSubMenu"); %>
    <h2>CodesAdmin</h2>
    <%= Html.DropDownList("items")%>
    <input type="button" id="btnGetCodes" name="GetCodes" 
        value="Get Codes" class="fg-button ui-state-default appButton"
        onclick="searchClick()"/>
    <div id="CodeAdminPlaceHolder"></div>
    <script type="text/javascript">
        function searchClick() {
            var searchText = $("#items").val();
            $.get("/Admin/CodeListing/", 
                { identifier: searchText }, function (data) {  
                    $("#CodeAdminPlaceHolder").html(data); 
                }, "html");
        }
    </script>
</asp:Content>

Теперь вот код контроллера, который вызывается нажатием кнопки:

public ActionResult CodeListing(string identifier)
{
    _entities.Refresh(System.Data.Objects.RefreshMode.StoreWins,
        _entities.Address_Type_Codes);

    var CodeList = _entities.Address_Type_Codes.
        Where(p=>p.active == true).ToList();

    return PartialView("ListOfAddrCodes", CodeList);
}

Действие CodeListing фактически обрабатывает несколько входов в зависимости от параметра «identifier».

Результирующий частичный вид, представленный в div "CodeAdminPlaceHolder":

<div id="Div15"  class="ui-widget-content">
    <table id="CodeListing" class="tablesorter">
        <thead>
            <tr>
                <th></th>
                <th>
                    Short Description
                </th>
                <th>
                    Long Description
                </th>
                <th>
                    Active
                </th>
                <th>
                    Tax Year
                </th>
                <th>
                    Note
                </th>
            </tr>
        </thead>

        <tbody>
            <% foreach (var item in Model) { %>

                <tr>
                    <td>
                        <%= Html.ActionLink("Deactivate", 
                            "DeactivateAddrCode", new { 
                                id=item.address_type_codes_id 
                             }) %>
                    </td>
                    <td>
                        <%: item.short_description %>
                    </td>
                    <td>
                        <%: item.long_description %>
                    </td>
                    <td>
                        <%: item.active %>
                    </td>
                    <td>
                        <%: item.tax_year %>
                    </td>
                    <td>
                        <%: item.note %>
                    </td>
                </tr>

            <% } %>
        </tbody>

        <tfoot>
            <tr id="pager">
                <td colspan="6">
                    <img src="/Content/TableSorter/Themes/Default/first.png"
                        class="firstPage" alt="First" />
                    <img src="/Content/TableSorter/Themes/Default/prev.png" 
                        class="prevPage" alt="Prev"/>
                    <input type="text" class="pagedisplay"/>
                    <img src="/Content/TableSorter/Themes/Default/next.png" 
                        class="nextPage" alt="Next"/>
                    <img src="/Content/TableSorter/Themes/Default/last.png" 
                        class="lastPage" alt="Last"/>
                    <select class="pagesize">
                        <option selected="selected" value="5">5</option>
                        <option value="10">10</option>
                        <option value="15">15</option>
                        <option  value="20">20</option>
                    </select>
                </td>
            </tr>
        </tfoot>
    </table>
</div>

Если кто-то нажимает ссылку «Деактивировать», это действие называется:

public ActionResult DeactivateAddrCode(int id)
{
    Address_Type_Codes ac1 = _entities.Address_Type_Codes.
        First(c => c.address_type_codes_id == id);

    ac1.active = false;
    _entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, 
        _entities.Address_Type_Codes);

    UpdateModel(ac1);

    _entities.SaveChanges();

    return RedirectToAction("ListCodeTypes");
}

Это загружает страницу обратно в начало с помощью выпадающего списка и кнопки.

Проблема в том, что когда я нажимаю кнопку, чтобы загрузить типы адресов, она не вызывает действие контроллера «CodeListing». Я проверил это, поместив точку останова в код «CodeListing» и, конечно же, код не вызывается. Поэтому, когда в выпадающем списке сделан выбор и нажата кнопка, отображаются неверные данные. Если я остановлю и перезапущу приложение в VS, данные перечисляются правильно.

Действие CodeListing вызывается только один раз, и я думаю, что кешированная страница возвращается.

Мы используем сущностный каркас для доступа к данным, но я не думаю, что наши проблемы как-то связаны с этим.

1 Ответ

0 голосов
/ 26 марта 2011

Не должен ли метод CodeListing быть украшен атрибутом [HttpPost] для получения запроса POST, созданного кнопкой отправки? Все мои «методы реагирования на кнопки» имеют его, и я, кажется, вспоминаю, что отсутствие этого атрибута будет означать, что метод не будет вызван.

...