Аннотирование свойств модели с значениями по умолчанию

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

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

И тогда мое представление Create выглядит так:

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

Ответ 1

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

Я бы немного переделал модель следующим образом:

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());
}

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

Ответ 2

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

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

Ответ 3

Model

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

контроллер

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

Он отлично работает.

Ответ 4

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

@model Person

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

return View();

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

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

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

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

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

return View(new Person.GetDefaultNew());

Ответ 5

Настройка параметра JSON.net DefaultValueHandling делает работу DefaultValue:

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