Обратная передача ASP.NET MVC PartialView: как проверить данные? - PullRequest
3 голосов
/ 08 сентября 2010

Я использую частичные представления ASP.NET, как в этом примере

<% using (Html.BeginForm()) { %>
    <table cellspacing="2" cellpadding="0" border="0" width="100%">
    <tr>
        <td><%= Html.LabelFor(model => model.PersonName)%></td>
        <td>
            <%= Html.TextBoxFor(model => model.PersonName)%>
            <%= Html.ValidationMessageFor(model => model.PersonName, "*")%>
        </td>
    </tr>
    ...
    <tr><td colspan="2"><%= Html.ValidationSummary(false) %></td></tr>
    </table>
<% } %>

Я показываю эти частичные представления в диалогах Jquery, вызывая их с помощью кода jquery

$.ajax({
    type: "get",
    dataType: "html",
    url: urlAction,
    data: {},
    success: function(response) {
        $("#panelDetail").html('').html(response).dialog('open');
    }
});

и все работает и делает меня счастливым. Я также могу отправить форму, используя jquery ajax, и это делает меня еще более счастливым. :)

Что действительно раздражает, так это то, что я не понял, где происходит проверка, потому что, когда это происходит, он полностью обновляет страницу и закрывает диалоговое окно.

Я уверен, что кто-то может помочь в этом. Во всяком случае .... кто будет? :)

Заранее спасибо!

EDIT

Это подпись действия контроллера с некоторым кодом

[HttpPost]
public ActionResult MyAction(FormCollection form) {
    string foroID = form["ForoId"];
    string foro = form["Foro"];
    string authorityId = form["AuthorityId"];
    string sezione = form["Sezione"];
    ...
}

Нужно ли заново создавать класс модели для его проверки?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

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

Второй из всех : ваши данные, отправляемые обратно в действие контроллера, проверяются в этой конкретной точке, пока ваше действие принимает параметр того же типа, что и ваш PartialView в качестве типа модели.Если к этому типу (классу) прикреплены аннотации данных к свойствам, они проверяются.Конечно, вы должны также проверить наличие ошибок модели в вашем действии и действовать соответственно.

Перенаправление? Если бы вы предоставили еще немного кода своего действия контроллера, мы могли бы легче проверить, чтои предоставлю некоторую дополнительную помощь.

Как я справился с этой ситуацией

Я создал специальный фильтр действий, который проверяет ошибки состояния модели и возвращает 400 клиенту с описанием ошибки.Все мои вызовы Ajax обрабатывают success, а также error отвечают и действуют соответственно.

Проверьте код здесь (вопрос и решение) .

Фактическое решение

Это решение основано на дополнительной информации, полученной из комментариев ниже

Так что после обсуждения проблема на самом деле не является полной страницей посленазад, но подтверждение, которое не произошло вообще.Причина в том, что действие контроллера принимает параметр типа FormCollection.Инфраструктура MVC вообще не знает, как проверять эти данные, поэтому проверка не происходит.

Изменение, которое вам нужно сделать, это изменить тип этого параметра, чтобы он соответствовал вашему представлению строгого типа.Если ваше представление имеет тип ViewPage<MyCustomType>, тогда ваше действие HttpPost, скорее всего, должно иметь параметр того же типа.

В общем случае тип действия может иметь параметры любого типа.Да, это может иметь еще больше параметров.Единственное ограничение заключается в том, что механизм связывания модели по умолчанию сможет связывать опубликованные данные с этими параметрами.Это то место, куда вы входите. Все, что вам нужно сделать, это правильно назвать свои параметры, а связыватель модели сделает все остальное.

Если вы столкнетесь с определенной ситуацией, когда это нелегко сделать, вы можетевсегда пишите пользовательскую привязку модели для определенного типа, и она будет полностью на вас, как анализировать опубликованные данные.

1 голос
/ 08 сентября 2010

с предложением Роберта в здесь

, прежде чем закрыть диалоговое окно, вы пытаетесь проверить ответ сервера при отправке формы через ajax, прежде чем закрыть диалоговое окно, попробуйтепроверить, является ли ответ действительным или недействительным состоянием модели, прежде чем вызвать dialog('close') диалогового окна.То же самое во всех остальных ситуациях диалогов.

...