mvc for ejemplo asp asp.net-mvc razor data-annotations html-helper

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.