asp.net mvc - for - Cómo agregar el atributo "required" al editor de entrada de texto mvc razor viewmodel
html editorformodel razor (5)
Tengo el siguiente ayudante MVC 5 Razor HTML:
@Html.TextBoxFor(m => m.ShortName,
new { @class = "form-control", @placeholder = "short name"})
Necesito que se requiera este campo (es decir, tener un contorno rojo cuando el usuario navega sin poner un valor inn). En un WebForms HTML 5, podría decir <input type="text" required />
para tener este efecto. ¿Cuál es la sintaxis correcta para lograr esto en una sintaxis de Razor?
En su clase de modelo, decore esa propiedad con el atributo [Required]
. Es decir:
[Required]
public string ShortName {get; set;}
La respuesta de @ Erik no me sobrevino.
Lo siguiente hizo:
@Html.TextBoxFor(m => m.ShortName, new { data_val_required = "You need me" })
Además de hacerlo manualmente en el campo, tuve que agregar el contenedor de mensajes de error
@Html.ValidationMessageFor(m => m.ShortName, null, new { @class = "field-validation-error", data_valmsg_for = "ShortName" })
Espero que esto te ahorre algo de tiempo.
Necesitaba el atributo HTML5 "requerido", así que hice algo como esto:
<%: Html.TextBoxFor(model => model.Name, new { @required = true })%>
Puede usar el atributo html required
si lo desea:
@Html.TextBoxFor(m => m.ShortName,
new { @class = "form-control", placeholder = "short name", required="required"})
o puede usar la clase RequiredAttribute en .Net. Con jQuery, RequiredAttribute
puede validar en el extremo frontal y en el lado del servidor. Si quieres ir a la ruta MVC, te sugiero que leas Anotaciones de datos del atributo MVC3 Obligatorio .
O
Puedes llegar realmente avanzado:
@{
// if you aren''t using UnobtrusiveValidation, don''t pass anything to this constructor
var attributes = new Dictionary<string, object>(
Html.GetUnobtrusiveValidationAttributes(ViewData.TemplateInfo.HtmlFieldPrefix));
attributes.Add("class", "form-control");
attributes.Add("placeholder", "short name");
if (ViewData.ModelMetadata.ContainerType
.GetProperty(ViewData.ModelMetadata.PropertyName)
.GetCustomAttributes(typeof(RequiredAttribute), true)
.Select(a => a as RequiredAttribute)
.Any(a => a != null))
{
attributes.Add("required", "required");
}
@Html.TextBoxFor(m => m.ShortName, attributes)
}
o si lo necesita para múltiples plantillas de editor:
public static class ViewPageExtensions
{
public static IDictionary<string, object> GetAttributes(this ViewWebPage instance)
{
// if you aren''t using UnobtrusiveValidation, don''t pass anything to this constructor
var attributes = new Dictionary<string, object>(
instance.Html.GetUnobtrusiveValidationAttributes(
instance.ViewData.TemplateInfo.HtmlFieldPrefix));
if (ViewData.ModelMetadata.ContainerType
.GetProperty(ViewData.ModelMetadata.PropertyName)
.GetCustomAttributes(typeof(RequiredAttribute), true)
.Select(a => a as RequiredAttribute)
.Any(a => a != null))
{
attributes.Add("required", "required");
}
}
}
luego en tus plantillas:
@{
// if you aren''t using UnobtrusiveValidation, don''t pass anything to this constructor
var attributes = this.GetAttributes();
attributes.Add("class", "form-control");
attributes.Add("placeholder", "short name");
@Html.TextBoxFor(m => m.ShortName, attributes)
}
Una nueva forma de hacer esto en .NET Core es con TagHelpers
.
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro
Sobre la base de estos ejemplos ( MaxLength , Label ), puede ampliar el TagHelper
existente para adaptarlo a sus necesidades.
RequiredTagHelper.cs
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using System.Linq;
namespace ProjectName.TagHelpers
{
[HtmlTargetElement("input", Attributes = "asp-for")]
public class RequiredTagHelper : TagHelper
{
public override int Order
{
get { return int.MaxValue; }
}
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
base.Process(context, output);
if (context.AllAttributes["required"] == null)
{
var isRequired = For.ModelExplorer.Metadata.ValidatorMetadata.Any(a => a is RequiredAttribute);
if (isRequired)
{
var requiredAttribute = new TagHelperAttribute("required");
output.Attributes.Add(requiredAttribute);
}
}
}
}
}
Luego deberá agregarlo para usarlo en sus vistas:
_ViewImports.cshtml
@using ProjectName
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper "*, ProjectName"
Dado el siguiente modelo:
Foo.cs
using System;
using System.ComponentModel.DataAnnotations;
namespace ProjectName.Models
{
public class Foo
{
public int Id { get; set; }
[Required]
[Display(Name = "Full Name")]
public string Name { get; set; }
}
}
y ver (fragmento):
New.cshtml
<label asp-for="Name"></label>
<input asp-for="Name"/>
Dará como resultado este HTML:
<label for="Name">Full Name</label>
<input required type="text" data-val="true" data-val-required="The Full Name field is required." id="Name" name="Name" value=""/>
Espero que esto sea útil para cualquier persona con la misma pregunta pero usando .NET Core.