Html.EditorFor Standardwert festlegen


77

Anfängerfrage. Ich habe einen Parameter, der an eine Erstellungsansicht übergeben wird. Ich muss einen Feldnamen mit einem Standardwert festlegen. @ Html.EditorFor (model => model.Id) Ich muss dieses Eingabefeld mit dem Namen Id auf einen Standardwert setzen, der über einen Aktionslink an die Ansicht übergeben wird.

Wie kann dieses Eingabefeld - @ Html.EditorFor (model => model.Id) - mit einem Standardwert festgelegt werden?

Würde das folgende funktionieren ?? Wo die Zahl 5 ein Parameter ist, übergebe ich das Textfeld, um den Standardwert festzulegen.

@Html.EditorFor(c => c.PropertyName, new { text = "5"; })

Antworten:


65

Der saubere Weg, dies zu tun, besteht darin, eine neue Instanz der erstellten Entität durch den Controller zu übergeben:

//GET
public ActionResult CreateNewMyEntity(string default_value)
{
    MyEntity newMyEntity = new MyEntity();
    newMyEntity._propertyValue = default_value;

    return View(newMyEntity);
}

Wenn Sie den Standardwert über ActionLink übergeben möchten

@Html.ActionLink("Create New", "CreateNewMyEntity", new { default_value = "5" })

Dies ist die Lösung, die ich letztendlich verwendet habe. Anton Semenov ist richtig: Die Ideologie von MVC erfordert, dass der Entwickler Standardwerte im Controller und nicht in der Ansicht festlegt.
Jake

101

Folgendes habe ich gefunden:

@Html.TextBoxFor(c => c.Propertyname, new { @Value = "5" })

arbeitet mit einem Kapital V, kein Kleinbuchstaben v (der Annahme sein Wert ist ein Schlüsselwort in Setter typischerweise verwendet) Lower vs oberen Wert

@Html.EditorFor(c => c.Propertyname, new { @Value = "5" })

funktioniert nicht

Ihr Code sieht jedoch so aus

<input Value="5" id="Propertyname" name="Propertyname" type="text" value="" />

Wert gegen Wert. Ich bin mir nicht sicher, ob ich das zu gern hätte.

Warum nicht einfach die Controller-Aktion einchecken, ob die Eigenschaft einen Wert hat oder nicht, und wenn sie ihn dort in Ihrem Ansichtsmodell nicht einfach auf Ihren Standardwert setzt, und ihn binden lassen, um zu vermeiden, dass all diese Affen in der Ansicht arbeiten?


4
Setzen Sie NIEMALS das Wertattribut, wenn Sie HtmlHelperMethoden verwenden. Sie legen den Wert der Eigenschaft in der GET-Methode fest, bevor Sie das Modell an die Ansicht übergeben.

und warum ist das?
Baksteen

17

Es ist nicht richtig, den Standardwert in der Ansicht festzulegen. Die Ansicht sollte Anzeigearbeiten ausführen, nicht mehr. Diese Aktion bricht die Ideologie des MVC-Musters. Also der richtige Ort, um Standardeinstellungen festzulegen - Methode der Controller-Klasse erstellen.


Ich möchte das Format eines Datums- / Uhrzeitwerts (TT / MM / JJJJ MM: HH: SS) in (JJJJ / MM / TT) ändern
Alan Ball

15

Bessere Option ist es, dies in Ihrem Ansichtsmodell wie zu tun

public class MyVM
{
   int _propertyValue = 5;//set Default Value here
   public int PropertyName{
       get
       {
          return _propertyValue;   
       }
       set
       {
           _propertyValue = value;
       }
   }
}

Dann aus Ihrer Sicht

@Html.EditorFor(c => c.PropertyName)

funktioniert so, wie du es willst (wenn kein Wert vorhanden ist, wird der Standardwert vorhanden sein)


Warum sollte ich einen Eigenschaftswert in der VM hart codieren? Das macht für mich keinen Sinn, aber vielleicht versuche ich etwas anderes zu machen? Ich versuche, den Abfragezeichenfolgenparameter id an die Ansicht "Erstellen" zu übergeben und den EditorFor-Helfer mit diesem ID-Wert zu füllen, damit die FK-ID in der Datenbank gespeichert wird. Wie mache ich das?
Katherine

4

Ich habe das gerade gemacht (Shadis erste Antwort) und es ist ein Vergnügen:

    public ActionResult Create()
    {
        Article article = new Article();
        article.Active = true;
        article.DatePublished = DateTime.Now;
        ViewData.Model = article;
        return View();
    } 

Ich könnte die Standardwerte wie ein richtiger MVC-Süchtiger in mein Modell einfügen: (Ich verwende Entity Framework)

    public partial class Article
    {
        public Article()
        {
            Active = true;
            DatePublished = Datetime.Now;
        }
    }

    public ActionResult Create()
    {
        Article article = new Article();
        ViewData.Model = article;
        return View();
    } 

Kann jemand irgendwelche Nachteile sehen?


1
Dies sind feste Standardwerte. Wenn Sie sie während der Laufzeit bereitstellen möchten, benötigen Sie einen anderen Ansatz.
Shadi

1
Danke @Shadi, technisch gesehen Datetime.Now ist kein fester Wert. Wenn der Standardwert wurde zur Laufzeit generiert, wäre es die Modelle Verantwortung oder der Controller sein?
Schmiede

3
Wenn Sie sich nur auf die MVC-Regeln beziehen (Sie können sie brechen!), Dient das Modell nur zum Speichern der Daten, zum Anzeigen zum Anzeigen, und Ihr Unternehmen sollte in den Controller oder die Klassen gestellt werden, auf die der Controller zugreift. Kurze Antwort, es liegt in der Verantwortung des Controllers.
Shadi

3

Sollten Sie nicht die @Html.EditorFor()Attribute verwenden, die Sie in Ihr Modell eingefügt haben?

[DefaultValue(false)]
public bool TestAccount { get; set; }

2

Schieben Sie es in die ViewBag:

Regler:

ViewBag.ProductId = 1;

Aussicht:

@Html.TextBoxFor(c => c.Propertyname, new {@Value = ViewBag.ProductId})

2

Das hat bei mir funktioniert

In Controlle

 ViewBag.AAA = default_Value ;

Im Hinblick auf

@Html.EditorFor(model => model.AAA, new { htmlAttributes = new { @Value = ViewBag.AAA } }

1

Das hat bei mir funktioniert:

In der Steuerung

*ViewBag.DefaultValue= "Default Value";*

In der Ansicht

*@Html.EditorFor(model => model.PropertyName, new { htmlAttributes = new { @class = "form-control", @placeholder = "Enter a Value", @Value = ViewBag.DefaultValue} })*

1

Für mich muss ich das aktuelle Datum und die aktuelle Uhrzeit als Standardwert festlegen. Dadurch wurde mein Problem in der Ansicht behoben. Fügen Sie diesen Code hinzu:

<div class="form-group">
        @Html.LabelFor(model => model.order_date, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.order_date, new { htmlAttributes = new { @class = "form-control",@Value= DateTime.Now }  })
                @Html.ValidationMessageFor(model => model.order_date, "", new { @class = "text-danger" })
                
            </div>
        </div>

Ich denke, die Antwort hier ist nicht DateTime.Now, sondern das @ value- Attribut, um den Wert des HTML-Elements festzulegen.
Kristianne Nerona

0

Legen Sie in der Konstruktormethode Ihrer Modellklasse den gewünschten Standardwert fest. Erstellen Sie dann in Ihrer ersten Aktion eine Instanz des Modells und übergeben Sie sie an Ihre Ansicht.

    public ActionResult VolunteersAdd()
    {
        VolunteerModel model = new VolunteerModel(); //to set the default values
        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult VolunteersAdd(VolunteerModel model)
    {


        return View(model);
    }

0

Dies ist mein Arbeitscode:

@Html.EditorFor(model => model.PropertyName, new { htmlAttributes = new { @class = "form-control", @Value = "123" } })

Mein Unterschied zu anderen Antworten besteht darin, Value im Array htmlAttributes zu verwenden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.