У меня есть страница ввода заказа и соответствующая ViewModel (упрощенный пример):
public class OrderCreateViewModel
{
[Required]
[StringLength(100)]
public string Remark { get; set; }
[Required]
[StringLength(50)]
public string AddressCity { get; set; }
}
Эта модель используется для представления Создать:
@model MyNamespace.OrderCreateViewModel
@using (Html.BeginForm())
{
@Html.ValidationSummary(false)
@Html.EditorFor(model => model.Remark)
@Html.EditorFor(model => model.AddressCity)
<input type="submit" value="Create order" name="saveButton" />
}
Действие Создать для запроса POST в контроллере:
[HttpPost]
public ActionResult Create(OrderCreateViewModel viewModel)
{
if (ModelState.IsValid)
{
// Save order in DB
return RedirectToAction("Index");
}
return View(viewModel);
}
Порядок (обязательные поля и длина строк) проверяется на стороне клиента (с использованием ненавязчивого Javascript, проверки jQuery) и на стороне сервера (ModelState.IsValid
).
Теперь я добавляю на страницу вторую кнопку, цель которой - сохранить Address
(AddressCity
в примере) в основной таблице. Это должно происходить с запросом Ajax POST (с использованием jQuery):
<input id="buttonAddAddress" type="button" value="Add address" />
К этой кнопке подключен обработчик события щелчка, который считывает содержимое полей ввода, связанных с адресом (в данном примере только AddressCity
), и отправляет POST-запрос на сервер:
$("#buttonAddAddress").click(function () {
var address = JSON.stringify({
City: $('#AddressCity').val()
});
$.ajax({
type: 'POST',
url: '@Url.Action("AddAddress")',
data: address,
dataType: 'json',
contentType: 'application/json; charset=utf-8',
...
});
});
Контроллер имеет соответствующее действие POST для этого запроса:
[HttpPost]
public ActionResult AddAddress(Address address)
{
// Create address in database
return Json(true);
}
Address
- вспомогательный тип:
public class Address
{
public string City { get; set; }
// ...
}
Этот код не подтверждает, что AddressCity
требуется и должен быть не длиннее 50 символов.
Вопрос: Как я могу добавить проверку к этому запросу POST Ajax - проверка на стороне клиента и на стороне сервера? Я понятия не имею, как это сделать на стороне клиента. На стороне сервера я бы хотел избежать очевидного тривиального решения, повторяющего значение атрибутов проверки (например, if (!string.IsNullOrEmpty(address.City) && address.City.Length <= 50) ...
и т. Д.) И использования существующих атрибутов проверки, если это вообще возможно.