Annotating properties on a model with default values

我怕爱的太早我们不能终老 提交于 2019-11-26 13:08:56

问题


I created an EF4.1 code-first model (may or may not be important), and I\'m trying to get default values for my Create scaffold template. My model looks like:

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

And then my Create view looks like:

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

I would expect at runtime, that the EditorFor would pre-populate the textbox with \"18\", but it does no such thing. Am I misunderstanding what the DefaultValue attribute is for, or is there something else I should be doing?

Note: I don\'t want to use the new { Value = \"18\" } override on the EditorFor method, it seems to break DRY.


回答1:


I don't know if this will satisfy your DRY needs, but it's a start I think.

I would rework the model a bit like this:

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

Keep the view as is, but in the create action do this:

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

That way, the input textbox will be created with the default Age value, and there will be only one place where that default will be specified.




回答2:


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

In this scenario, every time you do a new Person age will be initialized with 18 as age, even when the new object is created by the Model Binder.




回答3:


Model

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

Controller

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

It works fine.




回答4:


Assuming that your view has a definition such as:-

@model Person

and your controllers HTML GET returns an empty View

return View();

Then simply add a class that can be rendered that contains default values

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

Another option is to add a singleton static helper to your Person class that returns a default, populated class

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

Then you need

return View(new Person.GetDefaultNew());



回答5:


Setting JSON.net's DefaultValueHandling parameter makes DefaultValue work:

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


来源:https://stackoverflow.com/questions/6779881/annotating-properties-on-a-model-with-default-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!