Question

Disons que j'ai les classes suivantes (pourriez-vous également déterminer si mes classes en termes de cette partie relationnelle sont correctes) :

public class EFDbContext : DbContext
{
    public DbSet<Project> Projects { get; set; }
    public DbSet<Address> Addresses { get; set; } // *
    public DbSet<Country> Countries { get; set; } // *
    // Custom model builder bindings for * coz of the plural issue with EF
}

public class Project
{
    public int ProjectID { get; set; }
    public string Name { get ; set; }

    public int AddressID { get; set; } // Database relation column
    public Address Address { get ; set; }
}

public class Address
{
    public int AddressID { get; set; }
    public string Address1 { get ; set; }    
    public string Address2 { get ; set; }

    public int CountryID { get; set; } // Database relation column
    public Country Country { get ; set; }
}

public class Country
{    
    public int CountryID { get; set; }
    public string Name { get; set; }
}

Comment pourrais-je faire le rasoir pour ça...

Ma page "Créer un projet" aura besoin d'un formulaire qui ressemble à ceci...mais ce n'est pas correct, n'est-ce pas ?

@model Project

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

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

J'ai donc fini par créer un Shared/EditorTemplates/Address.cshtml qui a ensuite construit le formulaire Adresse :

@model Address

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

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

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

Et enfin celui du Country...Ce qui nécessite une saisie anticipée (donc certaines classes personnalisées ajoutées au editorfor ce que tu ne peux pas faire, alors je l'ai fait textbox ) - Shared/EditorTemplates/Country.cshtml

@model Country

    <div class="form-group">
        @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBox("", Model.Name.ToString(), new { @class = "countries typeahead" })
        </div>
    </div>

Est-ce que cela semble correct ?Je trouve cela très écrasant et déroutant (au fait, j'ai essayé ça et ça ne marche pas...mais si je sais que c'est la bonne voie, alors je peux continuer dans cette direction) !

Était-ce utile?

La solution

Vous êtes sur la bonne voie.Faites simplement attention à l'endroit où vous placez vos EditorTemplates dans la structure du projet et à la manière dont vous y faites référence.La convention MVC ne fonctionne pas toujours comme vous l'espériez, par ex.utiliser des modèles d'éditeur pour un modèle unique lorsque le modèle est enveloppé dans une liste.

Une suggestion que je ferais serait d'utiliser un "modèle de vue" complètement séparé pour le modèle transmis à vos vues de rasoir.Vous pouvez mapper entre votre modèle de vue et votre modèle de cadre d'entité (alias modèle de données) en utilisant quelque chose comme automapper.Pourquoi?Vous constaterez au fil du temps qu'ils auront besoin de choses différentes, par ex.Attributs mvc sur les propriétés du modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top