Поля группы ASP.NET MVC5 Entity Framework (страна, штат) для учетной записи

У меня есть классы Company, Country и State. Состояние связано со страной. Состояние и страна являются внешним ключом для компании.

Проблема Company View показывает штат и страну в виде отдельных раскрывающихся списков. Но я ожидаю, что когда я выберу штат, соответствующая страна должна измениться или наоборот. Возможно ли это в модели MVC5 EF.

Класс компании

public class Company
{
    public int CompanyID { get; set; }
    [Required]
    [StringLength(100,MinimumLength=3)]
    public string Name { get; set; }
    [StringLength(200)]
    public string Address { get; set; }
    public int? StateID { get; set; }
    public virtual State State { get; set; }
    public int? CountryID { get; set;}
    public virtual Country Country { get; set; }
    public int CompanyTypeID { get; set; }
    public virtual CompanyType CompanyType { get; set; }

}

Класс страны

public class Country
{
    public int CountryID { get; set; }
    [Required]
    [StringLength(100)]
    public string Name { get; set; }
    public virtual ICollection<State> States { get; set; }
    public virtual ICollection<Company> Companies { get; set; }
}

Государственный класс

public class State
{
    public int StateID { get; set; }
    [Required]
    [StringLength(100)]
    public string Name { get; set; }
    public int CountryID { get; set; }
    public virtual Country Country { get; set; }

    public virtual ICollection<Company> Companies { get; set; }

}

Я создал леса и сгенерировал представление и представление компании для справки.

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Company</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Address, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.StateID, "StateID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("StateID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.StateID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CountryID, "CountryID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("CountryID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CountryID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CompanyTypeID, "CompanyTypeID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("CompanyTypeID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CompanyTypeID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div> } <div> @Html.ActionLink("Back to List", "Index")

@section Скрипты { @Scripts.Render("~/bundles/jqueryval") }

Любая помощь будет оценена


person Gopi    schedule 16.07.2015    source источник


Ответы (2)


Что вам нужно, так это каскадные выпадающие списки. Вот пример из CodeProject.

http://www.codeproject.com/Articles/258172/Simple-Implementation-of-MVC-Cascading-Ajax-Drop-D

person LSU.Net    schedule 16.07.2015
comment
Спасибо, есть ли возможность сгруппировать эти два свойства в Model и Controller, чтобы Visual Studio могла сгенерировать для меня код. - person Gopi; 16.07.2015
comment
Нет. Вам нужно будет написать код. Элементы управления HTML не имеют понятия зависимости, как указывали другие. - person LSU.Net; 16.07.2015

Возможно ли это в модели MVC5 EF.

Да. Но вам нужно будет выполнить эту работу (или получить (купить) элементы управления, которые сделают это за вас).

Ограничение заключается не в MVC, а в том, что элементы управления HTML по умолчанию не имеют понятия о зависимости от другого. Либо напишите код для изменения содержимого раскрывающегося списка «Состояние» при изменении раскрывающегося списка «Страна» (это может включать фильтрацию списка штатов по выбранной стране), либо получите элементы управления сторонних производителей, которые делают это (это обычное требование, поэтому многие управления 1).


1 Но Stack Overflow не дает рекомендаций по инструментам.

person Richard    schedule 16.07.2015
comment
Я не собираюсь использовать сторонние элементы управления. Так что единственный вариант - сделать это вручную в представлении или есть обходной путь - person Gopi; 16.07.2015