Используя Razor для создания формы для иерархии доменных моделей

StackOverflow https://stackoverflow.com//questions/22012121

Вопрос

Позвольте сказать, что у меня есть следующие классы (не могли бы вы также рассмотреть, если мои занятия с точки зрения этой части соотношения верны):

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

Как бы я пошел в бритву для этого ...

Мой «созданный проект» нужна форма, которая выглядит что-то подобное ... но это не правильно правильно?

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

Так что я закончил создать генеракодицетагкод, который затем построил форму адреса:

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

И, наконец, страна один ... который нуждается в Typeabead (поэтому некоторые пользовательские классы, добавленные к Shared/EditorTemplates/Address.cshtml, который вы не можете сделать, я сделал editorfor) - textbox

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

Это выглядит правильно?Я нахожу это очень подавляющим и запутанным (кстати, я попробовал это, и это не работает ... Но если я знаю, что это правильно, то я могу толкнуть в этом направлении)!

Это было полезно?

Решение

Вы на правильном пути.Просто будьте осторожны с тем, где вы помещаете свои редактирования в структуре проекта и как вы относитесь к ним.Конвенция МВЦ не всегда работает так, как вы будете надеяться, например,Использование шаблонов редактора для одной модели, когда модель завернута в список.

Одно предложение Мне было бы использовать полностью отдельную «модель просмотра» для модели, передаваемой на ваши виды бритвы.Вы можете сопоставиться между моделью «Вид» и «Модель вашей организации» (модель данных AKA), используя что-то вроде Automapper.Почему?Вы найдете со временем, что им потребуют разные вещи, например,Атрибуты MVC о свойствах модели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top