ASP.NET MVC3 - obszar tekstowy z @ Html.EditorFor

209

Mam aplikację ASP.NET MVC3 i mam również formularz dodawania wiadomości. Kiedy VS2010 utworzył widok domyślny, mam tylko dane wejściowe dla danych tekstowych, ale chcę mieć obszar tekstowy dla tekstu wiadomości. Jak mogę to zrobić ze składnią Razor.

Wprowadzanie tekstu wygląda następująco:

@Html.EditorFor(model => model.Text)
Jacob Jedryszek
źródło
Powiązane, zapoznaj się z odpowiedzią na inne pytanie dotyczące sposobu dostosowania tego edytora szablonów.
Jeroen

Odpowiedzi:

375

Możesz użyć [DataType]atrybutu w swoim modelu widoku w następujący sposób:

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

i wtedy możesz mieć kontroler:

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

i widok, który robi to, co chcesz:

@model AppName.Models.MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Text)
    <input type="submit" value="OK" />
}
Darin Dimitrov
źródło
7
Prawie to, czego szukałem, ale co, jeśli muszę określić atrybuty html wierszy i cols?
Jason
3
Nadal otrzymuję [class = "text-box single-line"] w kodzie źródłowym :(
Stavros
7
Niezwykle kompetentny i wciąż tak prosty, jak to tylko możliwe, i wyjaśnia wszystko krok po kroku. grad @Darin Dimitrov.
İsmet Alkan
@Jason używa stylów CSS.
Jo Smo,
DataAnnotationsftw! Dziękuję Ci.
Kon
136

Ktoś zapytał o dodanie atrybutów (w szczególności „wierszy” i „kols”). Jeśli używasz Razor, możesz po prostu to zrobić:

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

To działa dla mnie. „@” Służy do zmiany słów kluczowych, dlatego są traktowane jak zmienne / właściwości.

Tyson Phalp
źródło
Rzeczywiście - jeśli wiesz, że chcesz mieć obszar tekstowy z kolumnami / wierszami, nie ma powodu, aby używać EditorFor zamiast TextAreaFor. Czy ktoś ma powód, dla którego nadal musisz korzystać z EditorFor i wiesz, że musisz podać cols / wiersze?
James Haug
95
@Html.TextAreaFor(model => model.Text)
addy
źródło
6
Bardziej podoba mi się ta metoda, ponieważ popularna odpowiedź tutaj polega na modyfikacji modelu bazy danych, co oznacza, że ​​musisz upuścić i ponownie utworzyć bazową bazę danych, jeśli używasz EntityFramework.
Ciaran Gallagher
6
Ta adnotacja DataType nie wymusza odświeżenia w Entity Framework.
Tallmaris,
9
@Ciaran: To oświadczenie powinno zadzwonić. Nigdy nie powinno być potrzeby zmiany warstwy bazy danych w celu modyfikacji interfejsu użytkownika. Powinien istnieć obiekt prezentacji odwzorowujący obiekt bazy danych. Nigdy nie używaj obiektu bazy danych w twoim interfejsie użytkownika.
Frederik Prijck
5
Dla jasności, Frederik odnosi się do tworzenia klas, które reprezentują twoje dane ODDZIELONE od klas używanych w twoim DbContext. Nie przekazuj modeli DbContext do widoków. Utwórz klasę modelu widoku, a następnie przenieś informacje, które Cię interesują, z modelu db do modelu widoku i odwrotnie, przyjmując dane wejściowe.
Jim Yarbro
3
@FrederikPrijck Nie zgadzam się, ale czy to nie narusza zasady DRY SUCHA? Musisz skopiować wszystkie właściwości z jednej klasy do drugiej. Czy znalazłeś mniej „przyziemne” robienie tego, co znalazłeś?
James Haug
1

Zadeklaruj w swoim modelu za pomocą

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

Następnie w .cshtml można skorzystać z edytora, jak poniżej. możesz użyć @cols i @rows dla rozmiaru TextArea

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

Dzięki !

Abdul Hadee
źródło