Domanda

Diciamo che ho le seguenti classi (potresti anche considerare se le mie classi in termini di tale relazione sono corrette):

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

Come dovrei andare a fare il rasoio per questo ...

La mia pagina "Crea progetto" avrà bisogno di un modulo che sembra qualcosa di simile ... Ma questo non è corretto giusto?

@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>
.

Così ho finito per creare un Shared/EditorTemplates/Address.cshtml che quindi costruiva il modulo di indirizzo:

@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>
.

E infine il paese uno ... che ha bisogno di una testata da typeahead (quindi alcune classi personalizzate aggiunte al editorfor che non puoi farlo ho fatto 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>
.

Questo sembra corretto?Lo trovo molto travolgente e confuso (BTW, ho provato questo e non funziona ... ma se so che è il modo corretto, allora posso spingere in quella direzione)!

È stato utile?

Soluzione

Sei sulla strada giusta.Stai solo attento a dove posizionate le tue renditories nella struttura del progetto e come ti riferisci a loro.La convenzione MVC non funziona sempre nel modo in cui avresti sperato ad es.Utilizzo dei modelli dell'editor per un singolo modello quando il modello è avvolto in un elenco.

Un suggerimento che avrei dovuto utilizzare un "modello di vista" completamente separato per il modello passato alle viste del rasoio.Puoi mappare tra il tuo modello di visualizzazione e il modello di framework dell'entità (AKA modello dati) usando qualcosa come Automapper.Perché?Troverai nel tempo che richiederanno cose diverse ad es.Attributi MVC sulle proprietà del modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top