Аннотирующие свойства в модели со значениями по умолчанию - PullRequest
26 голосов
/ 21 июля 2011

Я создал модель EF4.1 с первым кодом (может или не может быть важной), и я пытаюсь получить значения по умолчанию для моего шаблона Создать скаффолд. Моя модель выглядит так:

class Person {
    [DefaultValue (18)]
    public int Age { get; set; }
}

И тогда мой вид создания выглядит так:

<div class="editor-label">
    @Html.LabelFor(model => model.Age)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Age)
    @Html.ValidationMessageFor(model => model.Age)
</div>

Я ожидал бы, что во время выполнения EditorFor будет предварительно заполнять текстовое поле "18", но это не делает ничего подобного. Я неправильно понимаю, для чего используется атрибут DefaultValue, или мне нужно что-то еще делать?

Примечание: я не хочу использовать переопределение new { Value = "18" } в методе EditorFor, похоже, он нарушает DRY.

Ответы [ 5 ]

33 голосов
/ 21 июля 2011

Я не знаю, удовлетворит ли это ваши потребности в СУХОЙ, но я думаю, это начало.

Я бы переделал модель немного так:

public class Person {
    private const int DEFAULT_AGE = 18;
    private int _age = DEFAULT_AGE;
    [DefaultValue(DEFAULT_AGE)]
    public int Age {
        get { return _age; }
        set { _age = value; }
    }
}

Сохраните вид как есть, но в действии create сделайте следующее:

public ActionResult Create() {
    return View(new Person());
}

Таким образом, текстовое поле ввода будет создано со значением возраста по умолчанию, и будет только одно место, где будет указано это значение по умолчанию.

7 голосов
/ 26 июня 2013
class Person {
    public Person() {
        Age = 18;    
    }
    public int Age { get; set; }
}

В этом сценарии каждый раз, когда вы делаете новый возраст человека, будет инициализироваться возрастом 18 лет, даже когда новый объект создается связывателем модели.

1 голос
/ 19 ноября 2013

Предполагая, что ваше представление имеет определение, такое как: -

@model Person

и ваши контроллеры HTML GET возвращает пустое представление

return View();

Затем просто добавьте класс, который может быть визуализирован, который содержит значения по умолчанию

return View(new Person{ Age = 18 });

Другой вариант - добавить одноэлементный статический помощник в ваш класс Person, который возвращает заполненный класс по умолчанию

  static public Person GetDefaultNew()
        {
            return new Person{ Age = 18 };
        }

Тогда вам нужно

return View(new Person.GetDefaultNew());
1 голос
/ 30 сентября 2013

Модель

class Person {
    public Person() {
        Age = 18;    
    }
    public int Age { get; set; }
}

Контроллер

public ActionResult Create() {
    return View(new Person());
}

Работает нормально.

0 голосов
/ 26 июня 2015

Установка JSON.net DefaultValueHandling параметр заставляет DefaultValue работать:

class Person {
    [JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
    [DefaultValue(18)]
    public int Age { get; set; }
}
...