Атрибуты MVC3 data-val- * не выводятся из шаблона редактора моделей - PullRequest
1 голос
/ 13 февраля 2012

Я создал шаблон редактора для одной из моих моделей в моем текущем проекте MVC3. Эта модель вызывает правильные редакторы для свойств основного режима, но в них отсутствуют ненавязчивые атрибуты data-val- * для проверки.

Как мне заставить MVC выдавать атрибуты data-val?

Вот моя модель

[MetadataType(typeof(FieldTripRouteMetadata))]
public partial class FieldTripRoute
{
    private class FieldTripRouteMetadata
    {
        [Required]
        [DisplayFormat(DataFormatString = "{0:d}")]
        public DateTime Date { get; set; }

        [Required]
        [DisplayName("Route")]
        public int RouteID { get; set; }

        [Required]            
        [DisplayName("Departure Time")]
        [UIHint("TimeWithPeriod")]
        [DisplayFormat(DataFormatString = "{0:h:mm tt}")]
        public DateTime DepartureTime { get; set; }

        [Required]
        [StringLength(255)]
        [DisplayName("Pickup Location")] 
        public String PickupLocation { get; set; }

        [Required]
        [StringLength(255)]
        public String Destination { get; set; }

        [Required]            
        [DisplayName("Arrival Time")]
        [UIHint("TimeWithPeriod")]
        [DisplayFormat(DataFormatString = "{0:h:mm t}")]
        public DateTime ArrivalTime { get; set; }

        public bool IsReturnRoute { get; set; }

        public int FieldTripID { get; set; }
    }

и мой шаблон редактора:

@model FieldTripRoute

@{string routeType = (Model.IsReturnRoute ? "return" : "");}

<fieldset class="add@(routeType)Route" style="clear: both; width: 620px; margin-right: auto; margin-left: auto;">
    <legend>Add Route</legend>
    <div style="float: left; width: 275px;">
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.Date)</div>
            <div class="editor-field">@Html.EditorFor(model => model.Date)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.Date)</div>
        </div>
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.DepartureTime)</div>
            <div class="editor-field">@Html.EditorFor(model => model.DepartureTime)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.DepartureTime)</div>
        </div>
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.ArrivalTime)</div>
            <div class="editor-field">@Html.EditorFor(model => model.ArrivalTime)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.ArrivalTime)</div>
        </div>
    </div>
    <div style="float: left;">
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.RouteID)</div>
            <div class="editor-field">@Html.DropDownListFor(model => model.RouteID, Model.EditRouteList)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.RouteID)</div>
        </div>
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.PickupLocation)</div>
            <div class="editor-field">@Html.TextBoxFor(model => model.PickupLocation)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.PickupLocation)</div>
        </div>
        <div>
            <div class="editor-label">@Html.LabelFor(model => model.Destination)</div>
            <div class="editor-field">@Html.EditorFor(model => model.Destination)</div>
            <div class="validation-error">@Html.ValidationMessageFor(model => model.Destination)</div>
        </div>          
    </div>        
    <div style="clear: both; width: 100px; margin: 20px auto 0 auto;">
        <input type="button" id="submit@(routeType)Form" name="submit@(routeType)Form" value="Add" />
    </div>
</fieldset>

И моя модель представления:

public class FieldTripEditViewModel
{
    public FieldTrip Trip { get; set; }        
    public FieldTripRoute Route { get; set; }        
    public FieldTripRoute ReturnRoute { get; set; }

    public FieldTripEditViewModel(){}

    public FieldTripEditViewModel(FieldTrip trip)
    {
        this.Trip = trip;
        this.Route = new FieldTripRoute();
        this.ReturnRoute = new FieldTripRoute {IsReturnRoute = true};
    }
}

Я посмотрел этого поста , и все мои базовые шаблоны редактора соответствуют идее оставить имя в виде пустой строки, чтобы позволить MVC сгенерировать его. И все же у меня все еще нет подтверждения.

1 Ответ

3 голосов
/ 17 февраля 2012

Мне удалось заставить его работать, добавив тег формы до и после моего шаблона редактора и добавив this.ViewContext.FormContext = new FormContext(); в начале шаблона редактора.

Похоже, что когда элемент управления передается в шаблон редактора, он теряет текущий контекст формы. Я попытался просто добавить команду ViewContext.FormContext, но без добавления тегов формы встроенная модель не будет проверена.

Итак, сейчас у меня есть форма внутри формы, и она работает как задумано, но кажется, что должен быть более простой способ.

Идея команды formContext пришла от здесь

...