ASP.NET MVC3 - Textbereich mit @ Html.EditorFor


209

Ich habe die ASP.NET MVC3-App und ich habe auch ein Formular zum Hinzufügen von Nachrichten. Als VS2010 die Standardansicht erstellt hat, habe ich nur Texteingaben für Zeichenfolgendaten, aber ich möchte einen Textbereich für Nachrichtentext haben. Wie kann ich das mit der Razor-Syntax machen?

Die Texteingabe sieht folgendermaßen aus:

@Html.EditorFor(model => model.Text)

Siehe auch diese Antwort auf eine andere Frage zum Anpassen dieser EditorTemplate.
Jeroen

Antworten:


375

Sie können das [DataType]Attribut in Ihrem Ansichtsmodell folgendermaßen verwenden:

public class MyViewModel
{
    [DataType(DataType.MultilineText)]
    public string Text { get; set; }
}

und dann könnten Sie einen Controller haben:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }
}

und eine Ansicht, die macht, was Sie wollen:

@model AppName.Models.MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Text)
    <input type="submit" value="OK" />
}

7
Ziemlich genau das, wonach ich gesucht habe, aber was ist, wenn ich die HTML-Attribute für Zeilen und Spalten angeben muss?
Jason

3
Ich erhalte immer noch [class = "text-box single-line"] im Quellcode :(
Stavros

7
Sehr kompetent und dennoch so einfach wie möglich und erklärt alles Schritt für Schritt. Hagel @Darin Dimitrov.
İsmet Alkan

@ Jason verwendet CSS für das Styling.
Jo Smo

DataAnnotationsftw! Danke dir.
Kon

136

Jemand fragte nach dem Hinzufügen von Attributen (insbesondere 'Zeilen' und 'Spalten'). Wenn Sie Razor verwenden, können Sie dies einfach tun:

@Html.TextAreaFor(model => model.Text, new { cols = 35, @rows = 3 })

Das ist für mich in Ordnung. Das '@' wird verwendet, um Schlüsselwörter zu maskieren, sodass sie als Variablen / Eigenschaften behandelt werden.


In der Tat - wenn Sie wissen, dass Sie einen Textbereich mit Spalten / Zeilen wünschen, gibt es wenig Grund, EditorFor anstelle von TextAreaFor zu verwenden. Hat jemand einen Grund, warum Sie EditorFor noch verwenden müssen und wissen, dass Sie Spalten / Zeilen angeben müssen?
James Haug

95
@Html.TextAreaFor(model => model.Text)

6
Diese Methode gefällt mir besser, da die häufig verwendete Antwort darin besteht, das Datenbankmodell zu ändern. Wenn Sie EntityFramework verwenden, müssen Sie die zugrunde liegende Datenbank löschen und neu erstellen.
Ciaran Gallagher

6
Diese DataType-Annotation erzwingt keine Aktualisierung in Entity Framework.
Tallmaris

9
@Ciaran: Diese Aussage sollte eine Glocke läuten. Es sollte niemals notwendig sein, die Datenbankebene zu ändern, um die Benutzeroberfläche zu ändern. Es sollte ein Präsentationsobjekt vorhanden sein, das dem Datenbankobjekt zugeordnet ist. Verwenden Sie niemals das Datenbankobjekt in Ihrer Benutzeroberfläche.
Frederik Prijck

5
Um klar zu sein, bezieht sich Frederik auf das Erstellen von Klassen, die Ihre Ansichtsdaten darstellen, SEPARAT von Klassen, die in Ihrem DbContext verwendet werden. Übergeben Sie Ihre DbContext-Modelle nicht an Ansichten. Erstellen Sie eine Ansichtsmodellklasse, und verschieben Sie die gewünschten Informationen vom Datenbankmodell in das Ansichtsmodell und umgekehrt, wenn Sie Eingaben akzeptieren.
Jim Yarbro

3
@FrederikPrijck Ich bin nicht anderer Meinung, aber verstößt das nicht gegen das DRY-Prinzip? Sie müssen alle Eigenschaften von einer Klasse in eine andere Klasse kopieren. Gibt es eine weniger "weltliche" Vorgehensweise, die Sie gefunden haben?
James Haug

1

Deklarieren Sie in Ihrem Modell mit

  [DataType(DataType.MultilineText)]
  public string urString { get; set; }

Dann kann in .cshtml der Editor wie folgt verwendet werden. Sie können @cols und @rows für die TextArea-Größe verwenden

     @Html.EditorFor(model => model.urString, new { htmlAttributes = new { @class = "",@cols = 35, @rows = 3 } })

Vielen Dank !

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.