ASP.NET MVC3 - área de texto con @ Html.EditorFor


209

Tengo la aplicación ASP.NET MVC3 y también tengo un formulario para agregar noticias. Cuando VS2010 creó la vista predeterminada, solo tengo entradas de texto para datos de cadena, pero quiero tener un área de texto para texto de noticias. Cómo puedo hacerlo con la sintaxis de Razor.

La entrada de texto se ve así:

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

Relacionado, vea esta respuesta a otra pregunta sobre cómo personalizar ese EditorTemplate.
Jeroen

Respuestas:


375

Puede usar el [DataType]atributo en su modelo de vista de esta manera:

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

y luego podrías tener un controlador:

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

y una vista que hace lo que quieres:

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

77
Más o menos lo que estaba buscando, pero ¿y si necesito especificar los atributos html de filas y cols?
Jason

3
Todavía obtengo [class = "text-box single-line"] en el código fuente :(
Stavros

77
Extremadamente bien informado y aún manteniéndolo tan simple como sea posible y explica todo paso a paso. salve @Darin Dimitrov.
Ismet Alkan

@ Jason utiliza CSS para diseñar.
Jo Smo

DataAnnotationsftw! Gracias.
Kon

136

Alguien preguntó sobre agregar atributos (específicamente, 'filas' y 'cols'). Si estás usando Razor, puedes hacer esto:

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

Funciona para mi. La '@' se usa para escapar de las palabras clave para que sean tratadas como variables / propiedades.


De hecho, si sabe que desea un área de texto con columnas / filas, hay pocas razones para usar EditorFor en lugar de TextAreaFor. ¿Alguien tiene una razón por la que aún necesitaría usar EditorFor y sabe que necesita especificar cols / rows?
James Haug

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

66
Me gusta más este método porque la respuesta popular aquí implica modificar el modelo de la base de datos, lo que significa que debe soltar y volver a crear la base de datos subyacente si usa EntityFramework.
Ciaran Gallagher

66
Esa Anotación de DataType no fuerza una actualización en Entity Framework.
Tallmaris

9
@Ciaran: Esta declaración debería sonar una campana. Nunca debería ser necesario cambiar la capa de la base de datos para modificar la interfaz de usuario. Debe haber un objeto de presentación, que sea mapeador del objeto de la base de datos. Nunca use el objeto de la base de datos en su interfaz de usuario.
Frederik Prijck

55
Para ser claros, a lo que Frederik se refiere es a crear clases que representen sus datos de vista SEPARAR a partir de las clases que se utilizan en su DbContext. No pase sus modelos de DbContext a las vistas. Cree una clase de modelo de vista, luego cambie la información que le interesa del modelo db al modelo de vista, y viceversa al aceptar entradas.
Jim Yarbro

3
@FrederikPrijck No estoy en desacuerdo, pero ¿eso no viola al director DRY? Debe copiar todas las propiedades de una clase a otra clase. ¿Hay algo menos "mundano" de hacerlo que has encontrado?
James Haug

1

Declara en tu modelo con

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

Luego, en .cshtml puede hacer uso del editor como se muestra a continuación. puedes usar @cols y @rows para el tamaño de TextArea

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

Gracias !

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.