ASP.NET MVC3 - textarea з @ Html.EditorFor


209

У мене є додаток ASP.NET MVC3, і я також маю форму для додавання новин. Коли VS2010 створив перегляд за замовчуванням, у мене є лише введення тексту для рядкових даних, але я хочу мати текстові області для тексту новин. Як я можу це зробити з синтаксисом Razor.

Введення тексту виглядає приблизно так:

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

Пов’язано, див. Цю відповідь на інше запитання про те, як налаштувати шаблон редактора.
Jeroen

Відповіді:


375

Ви можете використовувати [DataType]атрибут у своїй моделі перегляду таким чином:

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

і тоді ви можете мати контролер:

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

і погляд, який робить те, що ви хочете:

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

7
Досить багато, що я шукав, але що робити, якщо мені потрібно вказати HTML-атрибути рядків і cols?
Джейсон

3
Я все ще отримую [class = "text-box one-line"] у вихідному коді :(
Ставрос

7
Надзвичайно обізнаний і все ще зберігає його так просто, як це отримує, і пояснює все крок за кроком. град @Дарин Димитров.
Ізмет Алкан

@Jason використовуйте CSS для стилізації.
Джо Смо

DataAnnotationsftw! Дякую.
Кон

136

Хтось запитав про додавання атрибутів (зокрема, "рядки" та "cols"). Якщо ви використовуєте Razor, ви можете просто зробити це:

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

Це працює для мене. '@' Використовується для виходу з ключових слів, тому вони трактуються як змінні / властивості.


Дійсно - якщо ви знаєте, що хочете, щоб текстова область була зі знаками / рядками, є мало причин використовувати EditorFor замість TextAreaFor. Хтось має причину, що вам все-таки потрібно використовувати EditorFor, і знаєте, що вам потрібно вказати cols / рядки?
Джеймс Хауг

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

6
Мені цей метод більше подобається, тому що популярна відповідь тут передбачає зміну моделі бази даних, а це означає, що вам потрібно скинути і відтворити базу даних, якщо використовується EntityFramework.
Ciaran Gallagher

6
Ця анотація DataType не вимагає оновлення в Entity Framework.
Талмаріс

9
@Ciaran: Цей вислів повинен дзвонити в дзвін. Ніколи не повинно виникати потреби змінювати рівень бази даних, щоб змінити інтерфейс користувача. Повинно бути об’єкт презентації, який є картографічним об'єктом бази даних. Ніколи не використовуйте об’єкт бази даних в інтерфейсі ур.
Фредерік Прийк

5
Щоб було зрозуміло, що Frederik має на увазі створення класів, які представляють ваші дані перегляду, відокремлені від класів, які використовуються у вашому DbContext. Не передавайте свої моделі DbContext в перегляд. Створіть клас моделі перегляду, а потім перемістіть інформацію, яка вас хвилює, з моделі db в модель перегляду, і навпаки, приймаючи введення.
Jim Yarbro

3
@FrederikPrijck Я не погоджуюся, але це не порушує принципу DRY? Ви повинні скопіювати всі властивості з одного класу в інший клас. Чи є менш "мирським" це зробити, що ви знайшли?
Джеймс Хауг

1

Заявіть у своїй моделі за допомогою

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

Тоді в .cshtml можна скористатися редактором, як показано нижче. ви можете використовувати @cols та @rows для розміру TextArea

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

Дякую !

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.