Значение по умолчанию в поле asp.net модель представления mvc



у меня есть эта модель:



public class SearchModel
{
[DefaultValue(true)]
public bool IsMale { get; set; }
[DefaultValue(true)]
public bool IsFemale { get; set; }
}


но на основе моих исследований и ответов здесь,DefaultValueAttribute Не задано значение по умолчанию. Но эти ответы были с 2008 года, есть ли атрибут или лучший способ, чем использование частного поля, чтобы установить эти значения в true при передаче в представление?



вот вид в любом случае:



@using (Html.BeginForm("Search", "Users", FormMethod.Get))
{
<div>
@Html.LabelFor(m => Model.IsMale)
@Html.CheckBoxFor(m => Model.IsMale)
<input type="submit" value="search"/>
</div>
}
505   6  

6 ответов:

установите это в конструкторе:

public class SearchModel
{
    public bool IsMale { get; set; }
    public bool IsFemale { get; set; }

    public SearchModel()
    { 
        IsMale = true;
        IsFemale = true;
    }
}

затем передайте его в представление в действии GET:

[HttpGet]
public ActionResult Search()
{
    return new View(new SearchModel());
}

создайте базовый класс для вашего ViewModels со следующим кодом конструктора, который будет применять DefaultValueAttributesпри создании любой наследующей модели.

public abstract class BaseViewModel
{
    protected BaseViewModel()
    {
        // apply any DefaultValueAttribute settings to their properties
        var propertyInfos = this.GetType().GetProperties();
        foreach (var propertyInfo in propertyInfos)
        {
            var attributes = propertyInfo.GetCustomAttributes(typeof(DefaultValueAttribute), true);
            if (attributes.Any())
            {
                var attribute = (DefaultValueAttribute) attributes[0];
                propertyInfo.SetValue(this, attribute.Value, null);
            }
        }
    }
}

и наследовать от этого в ваших ViewModels:

public class SearchModel : BaseViewModel
{
    [DefaultValue(true)]
    public bool IsMale { get; set; }
    [DefaultValue(true)]
    public bool IsFemale { get; set; }
}

использовать определенное значение:

[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6

Что вы будете есть? Вероятно, вы получите поиск по умолчанию и поиск, который вы загружаете откуда-то. Поиск по умолчанию требуется конструктор по умолчанию, так как один освобождающий лук уже предложил.

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

в случае, если вам нужно разместить ту же модель на сервере решение с наличием по умолчанию bool значение в конструкторе не будет жизнеспособным для вас. Давайте представим, что у вас есть следующая модель:

public class SearchModel
{
    public bool IsMale { get; set; }

    public SearchModel()
    { 
        IsMale = true;
    }
}

на вид у вас будет что-то вроде этого:

@Html.CheckBoxFor(n => n.IsMale)

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

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

@Html.CheckBoxFor(n => n.IsMale, new { @checked = "checked" })

просто хотел отметить ответ @Dismissile, так как я не могу отредактировать его ответ или добавить комментарий к нему, чтобы указать, что вызов конструктора представления new приведет к ошибке (проверено в Visual Studio 2015), что имеет смысл, поскольку мы просто создаем экземпляр модели, а не класса представления. Правильная строка кода будет:

return View(new SearchModel());

Comments

    Ничего не найдено.