MVC过滤器不工作

本文关键字:工作 过滤器 MVC | 更新日期: 2023-09-27 17:53:00

我完全被这个问题难住了,希望这里有人能帮助我。我遵循这里的示例

http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

,我发誓我的过滤工作得很好,但后来我回来发现它不再工作。当我运行页面并在过滤器中输入一些内容并按"Search"时,我得到以下错误:

'/'应用程序中的服务器错误。找不到资源。描述:HTTP 404。您正在查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下网址,并确保拼写正确。

请求的URL:/HomeController/Transactions

我在我的HomeController.cs中有如下方法。

    public ActionResult Transactions(string sortOrder, string currentFilter, string searchString, int? page)
    {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.DateSortParm = sortOrder == "Date" ? "Date_Desc" : "Date";
        ViewBag.AmountSortParm = sortOrder == "Amount" ? "Amount_Desc" : "Amount";
        ViewBag.DescriptionSortParm = sortOrder == "Desc" ? "Desc_Desc" : "Desc";
        ViewBag.TableNameSortParm = sortOrder == "TableName" ? "TableName_Desc" : "TableName";
        ViewBag.CatTypeSortParm = sortOrder == "CatType" ? "CatType_Desc" : "CatType";
        ViewBag.CatNameSortParm = sortOrder == "CatName" ? "CatName_Desc" : "CatName";
        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }
        ViewBag.CurrentFilter = searchString;
        var transactions = from s in db.Transactions
                       select s;
        if (!String.IsNullOrEmpty(searchString))
        {
            transactions = transactions.Where(s => s.TranDescription.ToUpper().Contains(searchString.ToUpper())
                                   || s.Account.Description.ToUpper().Contains(searchString.ToUpper())
                                   || s.Category.CategoryType.CatType.ToUpper().Contains(searchString.ToUpper())
                                   || s.Category.CatName.ToUpper().Contains(searchString.ToUpper()));
        }
        switch (sortOrder)
        {
            case "Date":
                transactions = transactions.OrderBy(s => s.TranDate);
                break;
            case "Date_Desc":
                transactions = transactions.OrderByDescending(s => s.TranDate);
                break;
            case "Amount":
                transactions = transactions.OrderBy(s => s.TranAmount);
                break;
            case "Amount_Desc":
                transactions = transactions.OrderByDescending(s => s.TranAmount);
                break;
            case "Desc":
                transactions = transactions.OrderBy(s => s.TranDescription);
                break;
            case "Desc_Desc":
                transactions = transactions.OrderByDescending(s => s.TranDescription);
                break;
            case "TableName":
                transactions = transactions.OrderBy(s => s.Account.Description);
                break;
            case "TableName_Desc":
                transactions = transactions.OrderByDescending(s => s.Account.Description);
                break;
            case "CatType":
                transactions = transactions.OrderBy(s => s.Category.CategoryType.CatType);
                break;
            case "CatType_Desc":
                transactions = transactions.OrderByDescending(s => s.Category.CategoryType.CatType);
                break;
            case "CatName":
                transactions = transactions.OrderBy(s => s.Category.CatName);
                break;
            case "CatName_Desc":
                transactions = transactions.OrderByDescending(s => s.Category.CatName);
                break;
            default:
                transactions = transactions.OrderByDescending(s => s.Account.Description);
                break;
        }
        int pageSize = 10;
        int pageNumber = (page ?? 1);
        return View(transactions.ToPagedList(pageNumber, pageSize));
    }

和我有以下代码在我的视图(Transactions.cshtml)。

@model PagedList.IPagedList<finance.Models.Transaction>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
    ViewBag.Title = "Transactions";
}
<h2>Transactions</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Transactions", "HomeController", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search" />
    </p>
}
<table class="table">
    <tr>
        <th>
            @Html.ActionLink("Date", "Transactions", new { sortOrder = ViewBag.DateSortParm })
        </th>
        <th>
            @Html.ActionLink("Amount", "Transactions", new { sortOrder = ViewBag.AmountSortParm })
        </th>
        <th>
            @Html.ActionLink("Description", "Transactions", new { sortOrder = ViewBag.DescriptionSortParm })
        </th>
        <th>
            @Html.ActionLink("Account", "Transactions", new { sortOrder = ViewBag.TableNameSortParm })
        </th>
        <th>
            @Html.ActionLink("Main Category", "Transactions", new { sortOrder = ViewBag.CatTypeSortParm })
        </th> 
        <th>
            @Html.ActionLink("Sub-Category", "Transactions", new { sortOrder = ViewBag.CatNameSortParm })
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.TranDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TranAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TranDescription)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Account.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Category.CategoryType.CatType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Category.CatName)
        </td>
        <td>
            @Html.ActionLink("Add Category", "EditTransactions", new { id = item.ID })
        </td>
    </tr>
}
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Transactions", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

这是来自我跟踪的调试信息。如果有帮助的话

PATH_INFO   /HomeController/Transactions
PATH_TRANSLATED D:'business'personal'finance'database'web'finance'finance'HomeController'Transactions
QUERY_STRING    SearchString=test
REMOTE_ADDR ::1
REMOTE_HOST ::1
REMOTE_PORT 65446
REQUEST_METHOD  GET
SCRIPT_NAME /HomeController/Transactions
SERVER_NAME localhost
SERVER_PORT 60085
SERVER_PORT_SECURE  0
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE Microsoft-IIS/8.0
URL /HomeController/Transactions
HTTP_CONNECTION keep-alive
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING    gzip, deflate
HTTP_ACCEPT_LANGUAGE    en-US,en;q=0.5
ASP.NET_SessionId=mjhmmkoroa3f054opatmm4yn
HTTP_HOST   localhost:60085
HTTP_REFERER    http://localhost:60085/Home/Transactions
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0

MVC过滤器不工作

404错误与搜索无关。它与路由有关。

/Home/Transactions试试或/Transactions

即使您没有查询参数,它仍然会命中方法

由于您的动作签名看起来像public ActionResult Transactions(string sortOrder, string currentFilter, string searchString, int? page),只有page是可选的,您在发送表单时缺少参数:

@using (Html.BeginForm("Transactions", "HomeController", FormMethod.Get))
{
    <p>
       Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
       <input type="submit" value="Search" />
</p>
}

你应该添加缺失的字段:

@using (Html.BeginForm("Transactions", "HomeController", FormMethod.Get))
{
    <p>
       Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
       @Html.TextBox("SortOrder")
       @Html.TextBox("CurrentFilter")
       <input type="submit" value="Search" />
</p>
}

我看到url写着

/HomeController/Transactions

必须是

/Home/Transactions
这就是创建表单 的方法
@using (Html.BeginForm("Transactions", "Home", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as     string)
        <input type="submit" value="Search" />
    </p>
}

Html.BeginForm("Transactions", "HomeController", FormMethod.Get)

,但

Html.BeginForm("Transactions", "Home", FormMethod.Get)

MVC将为你解析home控制器。

https://msdn.microsoft.com/en-us/library/dd492692 (v = vs.118) . aspx

查看示例