ASP.NET MVC3 - текстовая область с @ Html.EditorFor

209

У меня есть приложение ASP.NET MVC3, и у меня также есть форма для добавления новостей. Когда VS2010 создал представление по умолчанию, у меня есть только текстовые вводы для строковых данных, но я хочу иметь текстовую область для текста новостей. Как я могу сделать это с помощью синтаксиса Razor.

Ввод текста выглядит так:

@Html.EditorFor(model => model.Text)
Джейкоб Джедришек
источник
Связанные, см. Этот ответ на другой вопрос о том, как настроить этот EditorTemplate.
Йероен

Ответы:

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 строк и столбцов?
Джейсон
3
Я все еще получаю [class = "text-box single-line"] в исходном коде :(
Ставрос
7
Чрезвычайно хорошо осведомленный и все еще держащий это настолько простым, как это получает и объясняет все шаг за шагом. град @ Дарин Димитров.
Исмет Алкан
@Jason использует CSS для стилизации.
Джо Смо
DataAnnotationsFTW! Спасибо.
Кон
136

Кто-то спросил о добавлении атрибутов (в частности, «строки» и «столбцы»). Если вы используете Razor, вы можете просто сделать это:

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

Это подходит для меня. '@' Используется для экранирования ключевых слов, поэтому они рассматриваются как переменные / свойства.

Тайсон Фалп
источник
В самом деле - если вы знаете, что хотите текстовую область с столбцами / строками, нет особых причин использовать EditorFor вместо TextAreaFor. У кого-нибудь есть причина, по которой вам все еще нужно использовать EditorFor, и знаете, что вам нужно указывать столбцы / строки?
Джеймс Хауг
95
@Html.TextAreaFor(model => model.Text)
Адди
источник
6
Мне больше нравится этот метод, потому что популярный ответ здесь включает изменение модели базы данных, что означает, что вы должны удалить и воссоздать базовую базу данных при использовании EntityFramework.
Кьяран Галлахер
6
Эта аннотация DataType не вызывает обновления в Entity Framework.
Tallmaris
9
@Ciaran: Это заявление должно позвонить в звонок. Не должно быть необходимости изменять уровень базы данных для изменения пользовательского интерфейса. Должен быть объект представления, который сопоставляется с объектом базы данных. Никогда не используйте объект базы данных в вашем UI.
Фредерик Прийк
5
Чтобы было ясно, что Фредерик имеет в виду, это создание классов, которые представляют данные вашего представления ОТДЕЛЬНЫЕ от классов, которые используются в вашем DbContext. Не передавайте свои модели DbContext в представления. Создайте класс модели представления, затем сдвиньте информацию, которая вас интересует, из модели БД в модель представления и наоборот при приеме входных данных.
Джим Ярбро
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 } })

Спасибо !

Абдул Хади
источник