Jquery 更新下拉列表值

Jquery 更新下拉列表值,jquery,asp.net-mvc,asp.net-mvc-2,drop-down-menu,Jquery,Asp.net Mvc,Asp.net Mvc 2,Drop Down Menu,在ViewModel中: SelectSafetyContacts = new SelectList(subcontractRepository.GetContacts(Subcontract.company_id), "contact_id", "contact_name", Subcontract.safety_contact); 在存储库中: public IQueryable<contact> GetContacts(Guid id) { retur

在ViewModel中:

SelectSafetyContacts = new SelectList(subcontractRepository.GetContacts(Subcontract.company_id), "contact_id", "contact_name", Subcontract.safety_contact);
在存储库中:

public IQueryable<contact> GetContacts(Guid id)
    {
        return
        db.companies
            .Where(c => c.active_status == true)
            .Where(c => c.primary_company == id || c.company_id == id)
            .SelectMany(ct => ct.contacts).Where(ct => ct.active_status == true);
    }
形式如下:

<%= Html.DropDownList("safety_contact", Model.SelectSafetyContacts, "** Select Contact **") %>

这非常有效,除非他们改变了公司的形式。然后需要更改联系人以匹配新公司。我假设我可以通过jQuery以某种方式实现这一点,但我不确定如何实现。我是否可以引用存储库中的GetContacts函数,以便将来如果对此选择进行更新,它将只在一个位置?

您可以使用AJAX实现这一点。当公司发生变化时,向服务器发送一个请求,传递新的公司id以获取相关的联系人。为此,需要控制器操作返回包含联系人下拉列表的局部视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SafetyContactsViewModel>" %>
<%= Html.DropDownListFor(x => x.SelectedContactId, Model.Contacts, "** Select Contact **") %>
型号:

public class SafetyContactsViewModel
{
    public int? SelectedContactId { get; set; }
    public IEnumerable<SelectListItem> Contacts { get; set; }
}
然后,Contacts.ascx部分将包含下拉列表:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SafetyContactsViewModel>" %>
<%= Html.DropDownListFor(x => x.SelectedContactId, Model.Contacts, "** Select Contact **") %>
是这样做的:

$('#company').change(function () {
            var company = $(this)[0].value.toString();
            $.getJSON('<%= ResolveUrl("~/Subcontracts/CompanyContacts/") %>' + company, null, function (data) {
                $('.contact').empty().append("<option value=''>**Select Contact**</option>");
                $.each(data, function (index, optionData) {
                    $('.contact').append("<option value='" + optionData.contact_id + "'>" + optionData.contact_name + "</option>");

                });
            });
        });
在我的控制器中:

public ActionResult Contacts(int? companyId)
{
    var contacts = new SafetyContactsViewModel
    {
        Contacts = new SelectList(
            subcontractRepository.GetContacts(companyId), 
            "contact_id", 
            "contact_name"
        )
    };
    return PartialView(contacts);
}
public ActionResult CompanyContacts(string id)
    {
        Guid companyId = new Guid(id);
        IEnumerable<contact> companycontacts = subcontractRepository.GetContacts(companyId);
        var contacts = (from c in companycontacts select new { contact_id = c.contact_id, contact_name = c.contact_name });

        return Json(contacts, JsonRequestBehavior.AllowGet);
    }