Добавить в белый список в подклассовой модели MVC3, используя BindAttribute - PullRequest
2 голосов
/ 19 марта 2011

Я использую белый список для привязки значений строки запроса / формы к моей модели. Это делается:

[Bind(Include = "Size,Color,Age,SizeOfTeeth")]
public class AnimalModel { ... }

Но, скажем, у меня есть подклассная модель с именем ElephantModel, и я хотел бы сохранить белый список в базовом классе и добавить в него некоторые свойства производного класса. Как бы я это сделал?

Я пытался:

[Bind(Include += "TrunkLength,Personality")]
public class ElephantModel : AnimalModel { ... }

Но, конечно, это не работает. Я подозреваю, что это на самом деле больше вопрос «Атрибуты», чем «обязательный» вопрос, но я не могу понять, какой синтаксис использовать.

ТИА! Matt

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Подкласс BindAttribute выглядит лучше, но помечен как запечатанный.Тогда я подумал изменить атрибут в конструкторе подкласса, но в нем используется отражение, которое я предпочел бы избегать без необходимости.

Поэтому я выбрал этот подход для базового класса:

[Bind(Include = WhiteList)]
public class AnimalModel {

  protected const string WhiteList = "Size,Color,Age,SizeOfTeeth";

}

Тогда для подкласса:

[Bind(Include = WhiteList)]
public class ElephantModel : AnimalModel {

  new protected const string WhiteList = AnimalModel.WhiteList + ",TrunkLength,Personality";

}  

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

1 голос
/ 20 марта 2011

Боюсь, это невозможно из-за природы атрибутов в C #.Атрибуты представляют метаданные, которые вставляются в результирующую сборку во время компиляции, что означает, что они могут принимать только выражения, известные во время компиляции.

Один из возможных обходных путей, который я бы порекомендовал вам, - это использование моделей представлений.Так, например, у вас будет следующая модель представления, в которую будут включены только те свойства, которые действительно должны быть связаны:

public class UpdateElephantViewModel
{
    public int Size { get; set; }
    public string Color { get; set; }
    public int Age { get; set; }
    public int SizeOfTeeth { get; set; }
    public int TrunkLength { get; set; }
    public string Personality { get; set; }
}

, которая также может выглядеть следующим образом, если модель базового вида будет использоваться повторно:

public class UpdateAnimalViewModel
{
    public int Size { get; set; }
    public string Color { get; set; }
    public int Age { get; set; }
    public int SizeOfTeeth { get; set; }
}

public class UpdateElephantViewModel : UpdateAnimalViewModel
{
    public int TrunkLength { get; set; }
    public string Personality { get; set; }
}

и тогда вы можете выполнить следующее действие контроллера:

[HttpPost]
public ActionResult Update(UpdateElephantViewModel model)
{
    ...
}

и, наконец, отобразить между моделью представления и фактической моделью Слона.Чтобы облегчить сопоставление между этими двумя типами, вы можете использовать AutoMapper .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...