GetUnobtrusiveValidationAttributes always returns an empty collection

I have a general editor. divI'm getting together. Some fields are required, and I would like to add an unobtrusive check. There is a presentation model associated with these fields, but it is stored in the collection, and this divone is independent of this collection.

So my model looks like this:

public class MyViewModel
{
    public List<GridModel> GridModels { get; set;}
}

public class GridModel
{
    [Required]
    public string GridField { get; set; }
}

and my view is as follows:

<div class="EditorDiv">
    @Html.TextBox("GridField")
</div>

Based on my research, I would have to do something like this:

@{
    var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(GridModel));
}
@Html.TextBox("myGridField", Html.GetUnobtrusiveValidationAttributes("GridField", metadata))

This compiles and runs just fine, but GetUnobtrusiveValidationAttributesalways returns an empty collection. What am I missing?

+4
source share
2 answers

.

ModelName = GridModels[0].GridField :

htmlHelper.GetUnobtrusiveValidationAttributes(ModelName)

empty dictionary.

, ModelMetadata ( ), :

var ModelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)
htmlHelper.GetUnobtrusiveValidationAttributes(ModelName, ModelMetadata )

, , :)

+1

@model GridModel ( <form>), @Html.TextBox("GridField") data-val-*.

html

<input data-val="true" data-val-required="The GridField field is required." id="GridField" name="GridField" type="text" value="">

, MyViewModel, @Html.TextBox("GridField") , MyViewModel, ,

<input id="GridField" name="GridField" type="text" value="">

, for ( EditorTemplate GridModel)

@model MyViewModel
@using (Html.BeginForm())
{
    for(int i = 0; i < Model.GridModels.Count; i++)
    {
        @Html.TextBoxFor(m => m.GridModels[i].GridField)
    }
}

( GridModel )

<input data-val="true" data-val-required="The GridField field is required." id="GridModels[0].GridField" name="GridModels[0].GridField" type="text" value="">

. , ( ), ,

@{
    var typeMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(GridModel));
    var propertyData = typeMetadata.Properties.Where(x => x.PropertyName == "GridField").FirstOrDefault();

propertyData , 2

{[data-val-required, The GridField field is required.]}
{[data-val, true]}

, - , , @Html.TextBox("myGridField", propertyData) , ,

0

All Articles