Я работаю над своим первым проектом ASP.NET MVC 3. Для некоторых полей на странице редактирования я хочу, чтобы пользователь мог выбрать значение из ранее введенных значений или ввести новое, поэтому для этого я использую автозаполнение jQuery. Эта часть, кажется, работает просто отлично. Теперь для некоторых полей пользователь может выбрать, вводить значение или нет, и если они его вводят, я хочу проверить его по некоторым правилам, поэтому я создал свой собственный ValidationAttribute
.
Часть проверки обязательно проверит данное значение на соответствие правилам и вернет правильное логическое значение для вызова IsValid
. Отлично.
Первая проблема , которая возникает у меня, заключается в том, что если IsValid
моего валидатора возвращает false, оно отображает указанное мной сообщение об ошибке, но если я ввожу что-то, что является действительным, TextBox
очищает цвет фона ошибки, но сообщение об ошибке не очищается. Это происходит либо в FF, либо в IE8.
Вторая проблема заключается в том, что для FireFox мои значения автозаполнения будут отображаться снова, когда я редактирую текст в текстовом поле, но в IE 8, когда возникает условие ошибки, мое автозаполнение перестает работать. Иногда, если я ввожу значение, которое, как я знаю, находится в списке автозаполнения, оно будет отображаться, но оно будет выглядеть несколько странно.
Возможно, я просто неправильно делаю эту проверку. Вот соответствующий код, который я использую. Я был бы весьма заинтересован в любом руководстве, которое можно дать по любому из этих вопросов. Атрибут является тестовым, но он демонстрирует поведение на моей странице.
Мой атрибут проверки:
public class MyAttribute : ValidationAttribute
{
...
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
var stringValue = Convert.ToString(value);
if (stringValue.Length == 0)
{
return true;
}
if (stringValue.Trim().Length == 0)
{
return false;
}
return true;
}
...
}
Мой код автозаполнения:
$("#toppingid").autocomplete({
source: function (request, response) {
$.ajax({
url: '@Url.Action("AvailableToppings", "IceCream")', type: "POST", dataType: "json",
data: { query: request.term },
success: function (data) {
response($.map(data, function (item) {
return { label: item, value: item };
}))
}
})
},
minLength: 1
});
Действие моего контроллера:
public JsonResult AvailableToppings()
{
// I actually retrieve this differently, but you get the idea
List<string> all = new List<string>() { "BerryCrush", "Caramel", "Fudge" };
return Json(all, JsonRequestBehavior.AllowGet);
}
Мой фрагмент кода:
@Html.TextBoxFor(model => model.Topping, new { @id = "toppingid" })
@Html.ValidationMessageFor(model => model.Topping)
Мой фрагмент модели представления:
[DisplayName("Topping:")]
[MyAttribute(ErrorMessage = "Can't be all blanks!")]
public string Topping { get; set; }
В моем посте у меня есть логика примерно такая:
[HttpPost]
public ActionResult Create(IceCreamCreateEditViewModel viewModel)
{
if (ModelState.IsValid)
{
// stuff happens here which isn't germane
return RedirectToAction("Index");
}
// redisplay the view to the user
return Create();
}
Я думаю, что это все соответствующие фрагменты кода. Спасибо за любые рекомендации, которые вы можете предоставить.