Обновить выпадающие значения - PullRequest
0 голосов
/ 08 июля 2010

В 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 в репозитории, чтобы в будущем, если будет выполнено обновление этого выбора, он будет только в одном месте?

Ответы [ 2 ]

0 голосов
/ 11 августа 2010

Сделал это так:

$('#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 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);
    }
0 голосов
/ 08 июля 2010

Вы можете достичь этого, используя AJAX. Когда компания изменится, отправьте запрос на сервер, передав новый идентификатор компании, чтобы получить связанные контакты. Для этого вам понадобится действие контроллера, возвращающее частичное представление, содержащее раскрывающийся список контактов:

Модель:

public class SafetyContactsViewModel
{
    public int? SelectedContactId { get; set; }
    public IEnumerable<SelectListItem> Contacts { get; set; }
}

Контроллер:

public ActionResult Contacts(int? companyId)
{
    var contacts = new SafetyContactsViewModel
    {
        Contacts = new SelectList(
            subcontractRepository.GetContacts(companyId), 
            "contact_id", 
            "contact_name"
        )
    };
    return PartialView(contacts);
}

Тогда ваше частичное Contacts.ascx будет содержать выпадающий список:

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

И затем вы можете прикрепить обработчик событий .change () к выпадающему списку компаний, который вызовет действие контроллера:

$(function() {
    $('#the_id_of_the_companies_drop_down').change(function() {
        $('#id_of_a_div_that_contains_the_contacts_drop_down')
            .load('/home/contacts', { companyId: $(this).val() });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...