Преобразование единого объекта Framework объекта в словарь - PullRequest
1 голос
/ 04 января 2012

У меня следующая проблема. У меня есть класс в модели структуры лица, который имеет свойства, например ::10000

class Company{
    public string Name {get; set};
    public string Address {get; set};
    public string Email{get; set};
    public string WebSite {get; set};
}

У меня есть конфигурация в базе данных, которая определяет, должно ли отображаться какое-либо поле или нет, например:

  • Имя: показать
  • Адрес: показать
  • E-mail: скрыть
  • Сайт: скрыть

Это динамично, и все поля имеют имена.

Когда я отображаю объект в поле зрения. Было бы неплохо как-то преобразовать отдельный объект в некоторый словарь, где ключом будет имя свойства, а значением будет значение свойства, поэтому я могу проверить для каждого поля по имени, должно ли оно отображаться или нет (возможно, в некотором цикле for-each) например:

CompanyDetails.cshtml

<h2>Company Details</h2>
@foreach(var property in modelDictionary.Keys){

    @if(IsVisible(property))
        @Html.Raw( modelDictionary[property] )
}

Как лучше всего преобразовать отдельный объект из модели структуры сущностей в словарь свойств? Должен ли я преобразовать его из объекта в словарь в действии контроллера или как-то использовать метаданные модели в представлении?

Я могу использовать отражение в классе Company и найти все свойства в классе, чтобы я мог заполнить словарь, но это выглядит как слишком старомодное решение, так что я хочу поболтать, есть ли лучший способ сделать это?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Вы можете использовать RouteValueDictionary, который позволяет преобразовать объект в словарь:

public class Company
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string WebSite { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new Company
        {
            Address = "some address",
            Email = "some email",
            Name = "some name",
            WebSite = "some website"
        };
        return View(new RouteValueDictionary(model));
    }
}

и в представлении:

@model RouteValueDictionary

<h2>Company Details</h2>
@foreach (var item in Model)
{
    if (IsVisible(item.Key))
    {
        <div>@item.Value</div>
    }
}
1 голос
/ 04 января 2012

Вы можете внедрить индексатор для вашей сущности и отобразить это отражение через одно из свойств вашей сущности.

Что-то вроде:

class Entity
{
    public bool this[int index] 
    {
        get 
        {
           // Select all properties, order by name and return the property index
        }
   }

    public bool this[string name] 
    {
        get 
        {
           // Select all properties and return the correct one.
        }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...