it-swarm.com.de

Standardwert in einem asp.net-MVC-Ansichtsmodell

Ich habe dieses Modell:

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

Basierend auf meinen Nachforschungen und Antworten hier setzt DefaultValueAttribute jedoch keinen Standardwert. Diese Antworten stammen jedoch aus dem Jahr 2008. Gibt es ein Attribut oder einen besseren Weg als die Verwendung eines privaten Felds, um diese Werte auf true festzulegen, wenn sie an die Ansicht übergeben werden?

Hier ist die Aussicht sowieso:

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

Stellen Sie dies im Konstruktor ein:

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

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

Übergeben Sie es dann der Ansicht in Ihrer GET-Aktion:

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

Erstellen Sie eine Basisklasse für Ihre ViewModels mit dem folgenden Konstruktorcode, der die DefaultValueAttributes anwendet, wenn ein Erbmodell erstellt wird.

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

Und erben Sie davon in Ihren ViewModels:

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

Verwenden Sie einen bestimmten Wert:

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

Falls Sie dasselbe Modell auf dem Server bereitstellen müssen, ist die Lösung mit dem Standardwert bool im Konstruktor für Sie nicht geeignet. Stellen wir uns vor, Sie haben folgendes Modell:

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

    public SearchModel()
    { 
        IsMale = true;
    }
}

Zu sehen hätten Sie so etwas:

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

Das Problem besteht darin, dass der Benutzer dieses Kontrollkästchen deaktiviert und auf dem Server bereitstellt. Der Standardwert wird dann im Konstruktor (der in diesem Fall true ist) eingerichtet.

In diesem Fall würde ich am Ende nur den Standardwert für die Sicht angeben:

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

Was wirst du haben? Sie erhalten wahrscheinlich eine Standardsuche und eine Suche, die Sie von irgendwo laden. Für die Standardsuche ist ein Standardkonstruktor erforderlich. Erstellen Sie daher einen Vorschlag, den Dismissile bereits vorgeschlagen hat. 

Wenn Sie die Suchkriterien an anderer Stelle laden, sollten Sie wahrscheinlich über eine Mapping-Logik verfügen.

0
user338195

Ich wollte nur auf @ Dismissiles Antwort eingehen, da ich weder seine Antwort bearbeiten noch einen Kommentar hinzufügen kann, um darauf hinzuweisen, dass der Aufruf des View-Konstruktors new zu einem Fehler führt (getestet in Visual Studio 2015), der seit uns sinnvoll ist erzeugen nur eine Instanz des Modells und nicht die View-Klasse. Die richtige Codezeile wäre:

return View(new SearchModel());
0
Juanse Albuja