none
submit ajaxform в partialview RRS feed

  • Вопрос

  • На view есть div в котором по ajax рендеряться несколько partialview(набор текстбоксов и 2 кнопки - вперед и назад).
    То есть на partialview код такой:
    @using (Ajax.BeginForm("form1", "Index", new AjaxOptions { UpdateTargetId = "adiv", InsertionMode = InsertionMode.Replace })) { ....
    <input id="Next" name="com" type="submit" value="Next"/>
    <input id="Back" name="com" type="submit" value="Back"/>
    А на контроллере в switch ловлю какую кнопку нажали из FormCollection и возвращаю следующую partialview. Вопрос в чем: на каждой partialview по 10 текстбоксов и валидаторов, все являются полями одной сущности. Записать соответственно в базу надо на последнем partialview. Подскажите в чем можно хранить данные пока пользователь дойдет до последней partialview? Кукисы нельзя, сессию не хочется забивать таким кол-вом мусора.
    26 июля 2013 г. 8:01

Ответы

  • Сделал отдельный action для обновления панелей и отдельный под return json:

    [AjaxOnly]
    public ActionResult Form1JSON()
            {
                EditModel model = new EditModel();
                ...
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                string ser = serializer.Serialize(model);
                return Json(ser, JsonRequestBehavior.AllowGet);
            }
    Естественно пометив класс EditModel как [Serializable]. А в скрипте поменял на:
    <script type="text/javascript">
        $(function() {
            $('#Next').click(function () {
                $.getJSON("/Index/Form1JSON", null, function (data) {
                    $('input[name=hidden_field]').val(data);});});});
    </script>
    Вроде все работает как задумывалось, но похоже придется добавлять кучу проверок на валидность данных на сервере в конце. Мало ли, что с hidden полем может произойти, или вообще js выключен на клиенте.
    30 июля 2013 г. 7:46

Все ответы

  • Так как в jquery не силен, нашел js скрипт, чуток переделал для проверки - все ок, #adiv перезаписал объектом из action контроллера.
    <script type="text/javascript">
        $(function() {
            $('#Next').click(function () {
                $.getJSON("/Index/form1", null, function (data) {
                    $("#adiv").replaceWith(data);
                });
            });
        });
    </script>
    Но не могу сообразить как повесить на нажатие кнопки Next на partialview одновременно сохранить textbox'ы на страницу (в hidden поля?) и показать следующую partialview.
    • Изменено YatajgaEditor 26 июля 2013 г. 8:38 Форматирование
    26 июля 2013 г. 8:04
  • У вас насколько вижу обработчик готов. В тот же метод пишите логику сохранения ланных в скрытое поле, а после вызов AJAX метода с сервера, для генерации частичного представления и замену. Сессия в данном случае будет лишней, но есть один критический момент. Если пользователь в середине этапа обновит страницу, то данные пропадут. И если это не критично, то всё нормально.

    Сделаем содержимое сообщества лучше, вместе!

    26 июля 2013 г. 8:42
    Модератор
  • То есть в методе контроллера оставляю return только view
    [HttpPost]
    [AjaxOnly]
    public ActionResult form1(FormCollection form)
            {
                if (ModelState.IsValid)
                { ...
                    //return Json(item, JsonRequestBehavior.AllowGet);
                    return PartialView("form2");
                }
                return View("Error");
            }
    А во вьюшке пишу
    <script type="text/javascript">$(function() {$('#Next').click(function () {
      $.getJSON("/Index/form1", null, function (data) {
         $("#hidden_field_name").replaceWith(data);});});});
    </script>
    @using (Ajax.BeginForm("form1", "Index", new AjaxOptions { UpdateTargetId = "adiv", InsertionMode = InsertionMode.Replace }))
    {...
    <input id="Next" name="com" type="submit" value="Next"/>
    <input id="Back" name="com" type="submit" value="Back"/>
    }
    Тогда получится, что при нажатии на кнопку Next отработает только ActionResult form1 с "return PartialView" и textbox'ы не сохранятся. И второй вопрос - если у меня у экземпляра класса который надо сохранить около 20 полей, как их записать в скрытое поле в зашифрованном/сериализованном виде, чтобы потом без склеиваний\рассклеиваний строк передать их из скрытого поля в action контроллера?

    • Предложено в качестве ответа YatajgaEditor 30 июля 2013 г. 11:28
    • Отменено предложение в качестве ответа YatajgaEditor 30 июля 2013 г. 11:28
    26 июля 2013 г. 10:01
  • Сделал отдельный action для обновления панелей и отдельный под return json:

    [AjaxOnly]
    public ActionResult Form1JSON()
            {
                EditModel model = new EditModel();
                ...
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                string ser = serializer.Serialize(model);
                return Json(ser, JsonRequestBehavior.AllowGet);
            }
    Естественно пометив класс EditModel как [Serializable]. А в скрипте поменял на:
    <script type="text/javascript">
        $(function() {
            $('#Next').click(function () {
                $.getJSON("/Index/Form1JSON", null, function (data) {
                    $('input[name=hidden_field]').val(data);});});});
    </script>
    Вроде все работает как задумывалось, но похоже придется добавлять кучу проверок на валидность данных на сервере в конце. Мало ли, что с hidden полем может произойти, или вообще js выключен на клиенте.
    30 июля 2013 г. 7:46
  • Выключенный js не такая серьёзная преграда (в плане безопасности), сколько использование валидации. Серверную валидацию использовать обязательно надо.

    Сделаем содержимое сообщества лучше, вместе!

    30 июля 2013 г. 11:28
    Модератор