MVC5:如何根据所选的下拉项进行过滤

时间:2018-11-19 19:18:06

标签: javascript c# asp.net-mvc-5

此问题被标记为与另一篇文章重复。该帖子专门且详细地解决了“ NullReference”异常。它提供了很多专门针对NullReference错误的可能原因的信息。

我的问题并非特定于NullReference错误。我的问题是“如何根据选定的下拉框项目过滤结果”。当然,在我反复试验的过程中-我遇到了NullReference错误,该错误在此处出现。但这不是我的问题的基础。我正在尝试做一个特定的功能,其他人也可能会觉得有用。 (1)可能会有更好的方法实现我的目标-也许有人会分享。 (2)我们可能会解决NullReference错误,只是发现更多弹出的错误。因此,此帖子不是特定于NullReference错误,而是特定于完成基于所选下拉项的“筛选结果”工作。 NullReference只是尝试实现真正问题的目标过程中的错误之一。因此,我不认为这是重复的。但是,很好。

如何根据从下拉框中选择的内容过滤结果?我正在使用MVC5,C#和javascript。

我在网上发现了(我认为是)一个很好的例子,并对其进行了修改以供自己测试。这是我到目前为止所拥有的

索引控制器:

public ViewResult Index()


    {
        var countries = new SelectList(
             db.ICS_Units.Select(r => r.DeliveryUnit).Distinct().ToList());

        ViewBag.Countries = countries;
        return View();

    }

索引视图

@model IEnumerable<ICS20web.Models.ICS_Order_History>

@{
ViewBag.Title = "Index";
}


<fieldset>

<h2>Index</h2>


<div>
    @Html.DropDownList("Countries", "select a Unit")
</div>

@{
    Html.RenderPartial("OrderHistoryPartial", ViewData.Model);
}


<br />
<div id="target">
</div>
<div id="log">
</div>

</fieldset>

JavaScript已添加到索引视图:

@Scripts.Render("~/Scripts/jquery-1.10.2.min.js")

<script type="text/javascript">
$(document).ready(function () {
    $("#testList").change(function () {
        $("#log").ajaxError(function (event, jqxhr, settings, exception) {
            alert(exception);
        });

   var countrySelected = $("select option:selected").first().text();
        $.get('@Url.Action("OrderHistoryPartial")',
            { id: countrySelected }, function (data) {
                $("#target").html(data);
            });
    });
});
</script>

部分视图(OrderHistoryPartial):

<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.DeliveryUnitID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.LoginID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.SuppliesID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.OrderDate)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.ExpectedMonth)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.ExpectedYear)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.OrderedBy)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.OrderAmount)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Measure)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.CurrentStatus)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.CurrentStatusDate)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.EmergencyOrder)
    </th>
    <th></th>
</tr>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.DeliveryUnitID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LoginID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SuppliesID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.OrderDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ExpectedMonth)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ExpectedYear)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.OrderedBy)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.OrderAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Measure)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CurrentStatus)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CurrentStatusDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.EmergencyOrder)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.OrderID }) |
            @Html.ActionLink("Details", "Details", new { id = item.OrderID }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.OrderID })
        </td>
    </tr>
}

</table>

OrderHistoryPartial控制器:

    public PartialViewResult OrderHistoryPartial(int id)
    {
        return PartialView(
            db.ICS_Order_History.Where(r => r.DeliveryUnitID == id).OrderByDescending(r => r.OrderDate)
                .ToList());
    }

我认为我已经很接近解决这个问题了,但是我已尽我所能,无需寻求帮助。

当前,出现以下错误:

  

对象引用未设置为对象的实例。描述:   当前执行期间发生未处理的异常   网络请求。请查看堆栈跟踪以获取有关的更多信息   错误及其在代码中的起源。

     

异常详细信息:System.NullReferenceException:对象引用   没有设置为对象的实例。

     

源错误:

     

第43行:第44行:第45行:@foreach(模型中的变量项)   第46行:{第47行:

我今天早些时候问了这个问题,但是我删除了该帖子,因为我认为这更有条理,并提供了更详细的信息。

1 个答案:

答案 0 :(得分:0)

您正在传入部分视图ViewData.Model,该视图为null,因为您正在调用不带参数的视图。两种可能的修复方法是

  1. 将代码从OrderHistoryPartial.OrderHistoryPartial添加到IndexController.Index并使用view(result)返回模型
    1. 改为使用HTML.Action调用您的部分视图,并传递一个ID @ html.Action(“ OrderHistoryPartial”,“ OrderHistoryPartial”,新{id =})