【问题标题】:Use a dropdownlist to filter results in MVC使用下拉列表过滤 MVC 中的结果
【发布时间】:2012-08-05 21:27:30
【问题描述】:

我有一个返回表格的 MVC Web 应用程序。我想向视图页面添加一个下拉列表,将表格过滤到选定的年份。什么是正确的方法?

我目前正在创建一个使用 JQuery 填充的下拉列表。我创建了一个 onChange 命令来回发,但我不知道如何在控制器中获取下拉列表的选定值。

这是我的代码片段:

在控制器中:

    public ActionResult Index()
    {
        int year = 2012;
        var vu_Estimates = dbBudget.vu_Estimates.OrderByDescending(o => o.Expense).ThenBy(o => o.CategoryGroupSortOrder).ThenBy(o => o.SortOrder).Where(o => o.Year == year).ToList();

        return View(vu_Estimates);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection formCollection)
    {
        int year = 2012;
        var vu_Estimates = dbBudget.vu_Estimates.OrderByDescending(o => o.Expense).ThenBy(o => o.CategoryGroupSortOrder).ThenBy(o => o.SortOrder).Where(o => o.Year == year).ToList();

        return View(vu_Estimates);
    }

在视图中,我有以下内容:

<script type="text/javascript">
    $(document).ready(function () {        
        $.post("/Estimate/PopulateYears/", { Year: $(this).val() }, function (data) {
            populateDropdown($("#ddlYears"), data);
        });
    });

    function populateDropdown(select, data) {
        select.html('');
        $.each(data, function (id, option) {
            select.append($('<option></option>').val(option.value).html(option.name));
        });
    }
</script>

<h2>Estimates List</h2>

<div>
    <% using (Html.BeginForm()) { %>
        <select id="ddlYears" onchange="this.form.submit();"></select> | <%: Html.ActionLink("Create New Year of Estimates", "CreateEstimates", "Estimate") %>
    <%} %>
</div>


<table>
    <tr>
        <th></th>
        <th>
            EstimateID
        </th>
        <th>
            CategoryID
        </th>
        <th>
            Year
        </th>
        <th>
            EstimateAmount
        </th>
        <th>
            CategoryName
        </th>
        <th>
            SortOrder
        </th>
        <th>
            CategoryGroupSortOrder
        </th>
        <th>
            Expense
        </th>
    </tr>

<% foreach (var item in Model) { %>
    <tr>
        <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item.EstimateID }) %> |
            <%: Html.ActionLink("Delete", "Delete", new { id=item.EstimateID })%>
        </td>
        <td>
            <%: item.EstimateID %>
        </td>
        <td>
            <%: item.CategoryID %>
        </td>
        <td>
            <%: item.Year %>
        </td>
        <td>
            <%: item.EstimateAmount %>
        </td>
        <td>
            <%: item.CategoryName %>
        </td>
        <td>
            <%: item.SortOrder %>
        </td>
        <td>
            <%: item.CategoryGroupSortOrder %>
        </td>
        <td>
            <%: item.Expense %>
        </td>
    </tr>
<% } %>

</table>

<p>
    <%: Html.ActionLink("Create New", "Create") %>
</p>

【问题讨论】:

    标签: asp.net-mvc select filter formcollection


    【解决方案1】:

    我建议使用 AJAX 发布下拉列表的值并返回使用此请求更新页面所需的数据。否则,每次选择元素中的值更改时,您都需要重新加载页面。

    $('#idOfSelectElement').change( function() {
        $.ajax({
            type: "POST",
            url: '/Estimate/PopulateYears',
            data: { 
                valueOfDropDown: $(this).val()
            },
            /* Response is the data returned from controller method */
            success: function (response) {
    
               var value1 = response.value1;
               var value2 = response value2;
    
               //TODO : Use these values to update your page.
    
               return false;
            }
        });
    });
    

    在您的控制器中,

    /* Assuming the value of your dropdownlist is integer. If not use string */
    public ActionResult PopulateYears(int valueOfDropDown)
    {
        try
        {
          /* Get data using the value of dropdownlist */
          var vu_Estimates = getData(valueOfDropDown);
    
          return Json(new 
          { 
              success = true,
              value1 = vu_Estimates.value1,
              value2 = vu_Estimates.value1
          }, JsonRequestBehavior.AllowGet);
        }
        catch
        {
            return Json(new { success = false } );
        }
    }
    

    【讨论】:

      【解决方案2】:

      首先,为您的下拉菜单命名:

      <div>
          <% using (Html.BeginForm()) { %>
              <select id="ddlYears" name="Years" onchange="this.form.submit();"></select> | <%: Html.ActionLink("Create New Year of Estimates", "CreateEstimates", "Estimate") %>
          <%} %>
      </div>
      

      然后使用FormCollection对象检索值:

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Index(FormCollection formCollection)
      {
          int year = Convert.ToInt32(formCollection["Years"]);
          var vu_Estimates = dbBudget.vu_Estimates.OrderByDescending(o => o.Expense).ThenBy(o => o.CategoryGroupSortOrder).ThenBy(o => o.SortOrder).Where(o => o.Year == year).ToList();
      
          return View(vu_Estimates);
      }
      

      类似的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多