2016-09-28 3 views
0

Я хотел бы, чтобы дополнительные свойства сложного типа требовались ТОЛЬКО в определенных случаях. для этого я использую FoolProof lib.ASP.NET MVC, Удалить [Обязательно] для сложных типов типов типов

Например, для регистрации расписания рабочей недели. У меня есть сложный класс POCO для хранения timespans так:

[ComplexType] 
class workDay{ 

    [Required] 
    public TimeSpan start { get; set; } 

    [Required] 
    public TimeSpan end { get; set; } 

    [Required] 
    public TimeSpan interval { get; set; } 

} 

соответствующая часть недели POCO класса:

[ComplexType] 
class Week{ 

    [Required] 
    public bool monday { get; set; } 
    [RequiredIfTrue("monday")] 
    public workDay monday_timespan {get;set;} 

    [Required] 
    public bool tuesday { get; set; } 
    [RequiredIfTrue("tuesday")] 
    public workDay tuesday_timespan {get;set;} 

    // ... 

    [Required] 
    public bool sundat { get; set; } 
    [RequiredIfTrue("sunday")] 
    public workDay sunday_timespan {get;set;} 
} 

Как вы можете видеть, класс WORKDAY требуется только заполняется, если день корреспондент верен.

Однако для проверки всегда требуются все интервалы времени. Как-то можно отключить требуемый параметр внутри параметра sub complextype на основе класса POCO недели?

+0

Требуется ли эта валидация только для того, боковая сторона? –

+1

Я не думаю, что 'RequiredIf' в' FoolProof' работает для сложных моделей, а также для аннотации для ближайшего, что в вашем случае означает аннотации 'workDay'. попробуйте добавить свойства 'workDay' в свой класс' Week', а затем обработать детали в привязке модели. – Hadee

+1

'[RequiredIf (" tuesday ")]' не имеет смысла. Формат: '[RequiredIf (" someOtherProperty "," ValueOfOtherProperty ")] Возможно, вы имели в виду' [RequiredIfTrue ("tuesday")] '? –

ответ

2

Вы не можете применять атрибуты проверки к сложным свойствам и получать проверку на стороне клиента, потому что вы не создаете (и не можете) элемент управления формы для сложного объекта (только свойства объекта). Вы должны создать модель представления для представления того, что вы хотите отобразить в окне (обратите внимание на NULLABLE свойства)

public class DayScheduleVM 
{ 
    public bool IsRequired { get; set; } // this will be used for conditional validation 
    [RequiredIf("IsRequired", ErrorMessage = "Please enter the start time")] 
    public TimeSpan? StartTime { get; set; } 
    [RequiredIf("IsRequired", ErrorMessage = "Please enter the end time")] 
    public TimeSpan? EndTime { get; set; } 
    [RequiredIf("IsRequired", ErrorMessage = "Please enter the interval")] 
    public TimeSpan? Interval { get; set; } 
} 
public WeekScheduleVM 
{ 
    public DayScheduleVM Sunday { get; set; } 
    public DayScheduleVM Monday { get; set; } 
    .... 
} 

и в представлении

@model WeekScheduleVM 
.... 
@using (Html.BeginForm()) 
{ 
    <table> 
     .... 
     <tbody> 
      <tr> 
       <td>@Html.DisplayNameFor(m => m.Sunday)</td> 
       <td>@Html.CheckBoxFor(m => Sunday.IsRequired)</td> 
       <td> 
        @Html.TextBoxFor(m => Sunday.StartTime) 
        @Html.ValidationMessageFor(m => Sunday.StartTime) 
       </td> 
       .... // ditto for EndTime and Interval 
      </tr> 
      <tr> 
       .... // ditto for Monday,Tuesday etc 
      </tr> 

Затем, если флажок установлен, вам получит ошибку клиента (и на стороне сервера), связанные с ним StartTime, EndTime и Interval свойства не заполнены (его непонятно, что такое Interval для - название предполагает его расчетное значение на основе StartTime и EndTime, поэтому может не потребоваться на вид)

Вы можете упростить это еще и значительно уменьшить количество кода в представлении, добавив свойство DayOfWeek перечисления в DayScheduleVM

public DayOfWeek Day { get; set; } 

так, что в методе GET, вы можете использовать

List<DayScheduleVM> model = new List<DayScheduleVM>(); 
foreach (var day in Enum.GetValues(typeof(DayOfWeek))) 
{ 
    days.Add(new DayScheduleVM { Day = (DayOfWeek)day }); 
} 
return View(model); 

и на вид

@model List<DayScheduleVM> 
.... 
@using (Html.BeginForm()) 
{ 
    <table> 
     .... 
     <tbody> 
      @for(int i = 0; i < Model.Count; i++) 
      { 
       <tr> 
        <td>@Html.DisplayFor(m => m[i].Day)</td> 
        <td>@Html.CheckBoxFor(m => m[i].IsRequired)</td> 
        <td> 
         @Html.TextboxFor(m => m[i].StartTime) 
         @Html.ValidationMessageFor(m => m[i].StartTime) 
        </td> 
        .... // ditto for `EndTime` and `Interval` 
       </tr> 
      } 
     </tbody> 
    </table> 
    <input type="submit" ... /> 
} 
Смежные вопросы