Как установить свойство привязки по умолчанию для свойства родительского объекта? - PullRequest
3 голосов
/ 08 декабря 2011

Я сталкиваюсь с кучей чего-то похожего на это:

public class TestClass
{
    public string Property1 {get;set;}
    public string Property2 {get;set;}
    public AddressType Type {get;set;}
    [RequiredIf("", "", ErrorMessage="...")]
    public int TypeId
    {
        get
        {
            if (Type == null)
                return 0;
            else
                return Type.Id;
        }
        set
        {
            Type = new AddressType() { Id = value };
        }
    }
}

public class AddressType
{
    public int Id {get;set;}
    public string Description {get;set;}
}

так что я могу смоделировать информацию в форме бритвы и получить привязку туда-сюда. Мне интересно, есть ли что-нибудь, что кто-нибудь знает, где я могу применить атрибут к "AddressType", чтобы установить свойство привязки по умолчанию для класса, или поместить атрибут к полю "Тип" в TestClass и сказать "Когда Вы связываете, действительно связываете с Type.Id, но в противном случае проверяете весь объект ...

Не уверен, правильно ли я спрашиваю, но я просто хочу более чистую реализацию, если это вообще возможно ... Я чувствую, что добавление TypeId - ненужная затея в классе, и это затрудняет чтение.

Спасибо, ребята!

1 Ответ

0 голосов
/ 10 декабря 2011

Хорошо, я не на 100% согласен с тем, что вы здесь просите, но я сделаю это, предположив, что AddressType обнуляем.

public class TestClass
{
    public AddressType? Type {get;set;}
    public int TypeId
    {
        get
        {
            return Type.HasValue ? Type.Value.Id : 0;
        }
    }
}

Глядя на AddressType, хотя я предполагаю, что этотип поиска получен из какого-либо хранилища данных.Я использую шаблоны T4 для генерации таких списков поиска (которые не меняют значения между выпусками), как перечисления в моих приложениях.Что, если вы сделаете это, избавит вас от множества стрессов.

Теперь, если вам нужен раскрывающийся список значений AddressType в представлении бритвы, вам придется проделать небольшую работу вконтроллер (К счастью, не очень)

public class BetterTestClass
{
    public AddressType? Type {get;set;}
}

... В вашем AddressController

public ActionResult Create(){

    // the name in the ViewBag should match 
    // the property you want to have a list on 
    ViewBag.Type = repository
                   .AddressTypes
                   .ToList()
                   .Select(p => new SelectListItem { 
                                    Key = p.Id, 
                                    Value = p.Description});

    ViewData.Model = new BetterTestClass();
    return View();
}

Существует множество примеров, если вы ищете @ Html.DropDownList

РЕДАКТИРОВАТЬ

Действительно трудно понять, что вы пытаетесь достичь с помощью своего вопроса.Но я постараюсь помочь.Во-первых, правильно ли я понимаю ваш вопрос:

  • TestClass имеет отношение 0..1 к AddressType
  • Тип адреса имеет идентификатор, поскольку он является классом сущности
  • По какой-то причине вы хотите, чтобы идентификатор AddressType устанавливался через пользовательский интерфейс, когда установлен AddressType.(который я изложил в своем ответе, заключая, что вам не понадобятся обязательные атрибуты)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...