Не получено имя поля в сообщении об ошибке неверного значения в аннотации данных для списка дат - PullRequest
1 голос
/ 13 марта 2019

У меня есть приложение MVC с похожим кодом. Я добавляю поля даты при нажатии кнопки, используя JS.

Модель:

public class FruitViewModel
{ 
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<FruitDate> DateList {get;set;}
}

public class FruitDate
{
    [DataType(DataType.Date, ErrorMessage = "Invalid Date")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime BuyDate{get;set;}
    [DataType(DataType.Date, ErrorMessage = "Invalid Date")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime SellDate{get;set};        
}

My View:

<input asp-for="Id" type="hidden">
<button id="btnAdd" type="button" value="Add row" class="btn btn-default">Save Changes</button>
<button id="btnSave" type="submit" value="Save Changes" class="btn btn-default">Save Changes</button>
<div id="divFruits" class="row">
</div>

JS

$(document).on('click', '#btnSubmit', function (e) {
    let newDiv = '<div class="row"><div class="col-md-12"> +
                 '<div class="col-xs-6"><input class="form-control" type="date" data-val="true" data-val-required="The BuyDate field is required." id="DateList_0__BuyDate" name="DateList[0].BuyDate" value="' + currentdate + '"> </div>' +
                 '<div class="col-xs-6"><input class="form-control" type="date" data-val="true" data-val-required="The SellDate field is required." id="DateList_0__SellDate " name="DateList[0].SellDate " value="' + currentdate + '"></div>' +           
                 '</div ></div >'

 $('#divFruits').append(newDiv);
});

Нажатие кнопки добавляет новую строку в divFruits, и все это прекрасно работает.

При отправке он отправляется в контроллер и код выглядит следующим образом.

[HttpPost]
public ActionResult SaveFruits(FruitViewModel model)
{
    try
    {
        if (ModelState.IsValid)
        {
        }
         var allErrors = ModelState.Values.SelectMany(v => v.Errors.Select(b => b.ErrorMessage));
         ModelState.AddModelError("", "An error occured. Please try again");
    }
}

Он работает нормально все время, а даты покупки и продажи привязываются к модели. На недопустимую дату покупки или продажи, скажем, 31.02.3019, состояние модели не соответствует ожидаемому. Однако переменная allErrors имеет сообщение

Недопустимое значение ''.

Почему я не получаю имя поля, которое является недопустимым полем, что-то вроде значения 'FruitDate [0] .BuyDate' недопустимо.

1 Ответ

0 голосов
/ 14 марта 2019

Вы не получаете имя поля, потому что атрибут DataType не проверяется перед привязкой данных публикации к модели.

Чтобы ваш атрибут Required работал, вы должны изменить свои поля DateTime, обнуляемые:

public DateTime? BuyDate{get;set;}

public DateTime? SellDate{get;set};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...