Champs de groupe ASP.NET MVC5 Entity Framework (pays, état) pour le compte

J'ai des cours d'entreprise, de pays et d'État. L'État est lié au pays. L'État et le pays sont des clés étrangères de la société.

Le problème Company View affiche à la fois l’État et le pays dans des listes déroulantes distinctes. Mais je m'attends à ce que lorsque je sélectionne l'État, le pays correspondant change ou vice versa. Est-ce possible dans le modèle MVC5 EF.

Classe d'entreprise

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; }

}

Classe de pays

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; }
}

Classe d'État

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; }

}

J'ai échafaudé et généré la vue et la vue de l'entreprise pour référence

@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 { @Scripts.Render("~/bundles/jqueryval") }

Toute aide serait appréciée


person Gopi    schedule 16.07.2015    source source


Réponses (2)


Ce dont vous avez besoin, ce sont des listes déroulantes en cascade. Voici un exemple de CodeProject.

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

person LSU.Net    schedule 16.07.2015
comment
Merci, s'il est possible de regrouper ces deux propriétés dans Model et Controller, afin que Visual Studio puisse générer le code pour moi. - person Gopi; 16.07.2015
comment
Non, vous devrez écrire le code. Les contrôles HTML n'ont aucun concept de dépendance comme d'autres l'ont souligné - person LSU.Net; 16.07.2015

Est-ce possible dans le modèle MVC5 EF.

Oui. Mais vous devrez faire le travail (ou obtenir (acheter) des contrôles qui le font à votre place).

La limitation n'est pas MVC, mais le fait que les contrôles HTML par défaut n'ont aucune idée de dépendre d'un autre. Soit vous écrivez du code pour modifier le contenu de la liste déroulante État lorsque la liste déroulante Pays change (cela peut inclure le filtrage de la liste des États par pays sélectionné), soit vous obtenez des contrôles tiers qui le font (c'est une exigence courante donc beaucoup de contrôles là-bas1).


1 Mais Stack Overflow ne fait pas de recommandations d'outils.

person Richard    schedule 16.07.2015
comment
Je ne cherche pas à utiliser des contrôles tiers. La seule option est donc de le faire manuellement dans View ou existe-t-il une solution de contournement - person Gopi; 16.07.2015