【问题标题】:Filter my @html.dropdownlistfor过滤我的@html.dropdownlistfor
【发布时间】:2013-04-24 01:54:29
【问题描述】:

我正在处理一个项目,我需要根据我的第一个 dropdownlistfor 值过滤我的第二个 dropdownlistfor。它很容易理解但很难编码,因为我不知道 jquery 或 javascript,并且我在 mvc asp.net 中工作,以及在数据所在的 sql server 中使用数据库。

我需要根据我的客户下拉列表过滤我的项目下拉列表。

这里是一些代码:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>TimeEntry</legend>

        <div class="editor-label">
            @Html.Label("Customer")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.TimeEntry.CustomerId, @customerSelectList)
            @Html.ValidationMessageFor(model => model.TimeEntry.CustomerId)
        </div>

        <div class="editor-label">
            @Html.Label("Project")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.TimeEntry.ProjectId, @projectSelectList, "[ - No project - ]")
            @Html.ValidationMessageFor(model => model.TimeEntry.ProjectId)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}


public IEnumerable<Customer> Customers { get; set; }
public IEnumerable<Project> Projects { get; set; }

这是一个我认为是从数据库调用但不太确定的代码:

var customers = service.GetAllCustomers().ToList();
model.Customers = new SelectList(customers, "CustomerId", "Name");
var projects = service.GetAllProjects().ToList();
model.Projects = new SelectList(projects, "ProjectId", "Name");

【问题讨论】:

  • 第二个下拉列表的 lisitems 来自哪里?您是否打算调用控制器方法(这才有意义)?
  • @von v 忘记了模型的代码,现在更新了
  • 恐怕这无济于事。您打算如何进行过滤?通过一些ajax调用对吗?所以你可以有一个控制器方法说GetProjects,它接受customerId的一个int,然后你查询你的数据库并返回一个json结果,你可以在客户端上使用它并构建你的项目下拉列表,是不是类似于方法你在想吗?
  • @von v, yh 类似,我一直在查看 jq、js、ajax 和 jason,但我还没有找到一个可以使用的好例子,我可以理解。只要有效,我可以使用任何调用方法
  • @von v 对问题进行了另一次编辑,在其中一个控制器中找到了另一个代码,我认为这是从数据库调用的

标签: javascript jquery asp.net-mvc filtering html.dropdownlistfor


【解决方案1】:

好的,所以你有一个控制器,它的方法可以为你提供过滤后的项目,如下所示:

public class FilterController:Controller {
    public ActionResult Projects(int customerId) {
        // I expect this call to be filtered
        // so I'll leave this to you on how you want this filtered       
        var projects = service.GetAllProjects().ToList();
        // at this point, projects should already be filtered with "customerId"
        return Json(new SelectList(projects, "ProjectId", "Name"),                
            JsonRequestBehavior.AllowGet);
    }
}

然后你像这样在客户端调用那个方法:

// when the customer dropdown changes, you want to use the selected value
// and filter the projects dropdown - more like refresh it
$("#TimeEntry_CustomerId").change(function(){
    refreshProjects($(this).val());
});
function refreshProjects(id) {
    var projects = $("#TimeEntry_ProjectId");
    $.get('@Url.Action("projects","filter")', {customerId:id}, 
        function (result) {
            // clear the dropdown
            projects.empty();
            // rebuild the dropdown
            $.each(result, function (i, e) {
                projects.append($('<option/>').text(e.Text).val(e.Value));
            });                
    });            
}

【讨论】:

  • 我一直在研究它并尝试了不同的解决方案,但我无法让它发挥作用。我们并不真正了解该功能的工作原理,因此我们正在考虑留下问题并将此代码发送给我们的支持者,但感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多