Проверка Asp.net MVC Custom Client не отображается на экране
Я пытаюсь осуществить ненавязчивую проверку клиента в первый раз. Я чувствую, что я очень близок, просто не могу отобразить сообщение на экране. Если кто-то может направить меня в правильном направлении, я был бы признателен. Вот что у меня так далеко.
Validation Attribute
public class WellTestRecordVal : ValidationAttribute , IClientValidatable
{
private WellTestViewModel record;
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
record = (WellTestViewModel) validationContext.ObjectInstance;
if (record.WtStartTime > record.WtEndtime)
return new ValidationResult("This is my server val message.");
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var startDate = DateTime.Today;
var rule1 = new ModelClientValidationRule();
rule1.ValidationType = "startdaterule";
rule1.ErrorMessage = "this is my iclient val message.";
return new[] {rule1};
}
Я применил это к свойству на моей модели как таковой:
[WellTestRecordVal]
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-ddThh:mm:ss}")]
public DateTime WtStartTime { get; set; }
У меня в комплекте есть все файлы unobtrusive.js и validate.unobtrusive.js, которые мне нужны.
Мой взгляд имеет проверку элемента.
<label>
<span>Start Date</span>
@Html.TextBoxFor(x => x.WtStartTime, "{0:yyyy-MM-ddThh:mm:ss}", new { @class = "form-control", @type = "datetime-local", id = "startDate" })
@Html.ValidationMessageFor(m => m.WtStartTime)
</label>
Мой Jquery для представления как таковой.
<script type="text/javascript">
$.validator.addMethod("startdaterule",
function(value, element, params) {
var endDate = $("#endDate").val();
if (value > endDate) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.add("startdaterule",function(options) {
options.rules["startdaterule"] = {};
options.messages["startdaterule"] = options.message;
});
Я использую Ajax.BeginForm в представлении.
Я вижу, что сообщение в моем GetClientValidationRules попадает в представление, когда я его проверяю.
Чего мне не хватает, чтобы это отображалось в самом представлении? Я чувствую, что мне не хватает чего-то чрезвычайно простого, что я мог упустить из виду из нескольких ресурсов, которые я рассмотрел по этому вопросу.
2 ответа
Я смог сузить свою проблему после покупки книги. Профессиональный ASP.NET MVC 5. Мой синтаксис был очень близок. У меня было два вопроса. Во-первых, я не передал никаких параметров, чтобы проверить мои значения. Во-вторых, мне нужно было позвонить @Scripts.Render("~/bundles/jqueryval")
до моего сценария проверки, который я отрисовываю. Недостаточно просто включить его. Порядок имеет значение.
Это другой подход, но для условной проверки я рекомендую использовать надежную проверку.
Для этого вам необходимо:
- установить простой пакет nuget
- добавлять
mvcfoolproof.unobtrusive.js
на ваши сценарии ( получить его отсюда)
Тогда вы можете использовать условную валидацию следующим образом:
public class MyModel
{
public DateTime WtStartTime { get; set; }
/* I want end time to be greater than or equal to start time */
[GreaterThanOrEqualTo("WtStartTime", ErrorMessage="End should be >= Start")]
public DateTime WtEndtime{ get; set; }
}
Вот и все, вам не нужно писать свой собственный код JavaScript для проверки на стороне клиента. Просто отметьте, что вам нужно добавить ValidationSummary в ваше представление. Вам необходимо добавить следующую строку в ваше представление, и оно будет отображать сообщения об ошибках.
@Html.ValidationSummary(true, "", new { @class = "text-danger" })