Проверьте данные для запроса Ajax POST - PullRequest
2 голосов
/ 20 января 2012

У меня есть страница ввода заказа и соответствующая 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) ... и т. Д.) И использования существующих атрибутов проверки, если это вообще возможно.

1 Ответ

3 голосов
/ 20 января 2012

Для сервера:

public class Address
{
    [Required]
    [StringLength(50)]
    public string City { get; set; }
}

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

Но так как я предполагаю, что вы скажете мне, что это не СУХО, ну, ООП на помощь:

public class AddressViewModel
{
    [Required]
    [StringLength(50)]
    public string City { get; set; }
}

и модель вашего основного вида:

public class OrderCreateViewModel: AddressViewModel
{
    [Required]
    [StringLength(100)]
    public string Remark { get; set; }
}

иваши соответствующие действия контроллера:

[HttpPost]
public ActionResult Create(OrderCreateViewModel viewModel)
{
    ...
}

[HttpPost]
public ActionResult AddAddress(AddressViewModel address)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...