Pregunta

Digamos que tengo las siguientes clases (¿podría considerar también si mis clases en términos de esa parte de relación son correctas):

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

¿Cómo haría para hacer el Razor para esto...?

Mi página "Crear proyecto" necesitará un formulario similar a este...pero esto no es correcto verdad?

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

Así que terminé creando un Shared/EditorTemplates/Address.cshtml que luego construyó el formulario de Dirección:

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

Y por último el Country...Lo cual necesita una escritura anticipada (por lo que se agregaron algunas clases personalizadas al editorfor lo cual no puedes hacer, así que lo hice 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>

¿Esto parece correcto?Lo encuentro muy abrumador y confuso (Por cierto, he probado esto y no funciona...pero si sé que es el camino correcto, entonces puedo seguir en esa dirección).

¿Fue útil?

Solución

Estás en el camino correcto.Solo tenga cuidado de dónde coloca sus EditorTemplates en la estructura del proyecto y cómo se refiere a ellos.La convención MVC no siempre funciona de la manera esperada, p.usar plantillas de editor para un solo modelo cuando el modelo está incluido en una lista.

Una sugerencia que tengo sería utilizar un "modelo de vista" completamente separado para el modelo pasado a sus vistas de afeitar.Puede mapear entre su modelo de vista y su modelo de marco de entidad (también conocido como modelo de datos) usando algo como automatapper.¿Por qué?Con el tiempo descubrirás que requerirán cosas diferentes, p.Atributos mvc en las propiedades del modelo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top