Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/50: Рейтинг темы: голосов - 50, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
1

Как передать параметр javascript контроллеру и обратно

09.01.2015, 17:07. Показов 10361. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Только начал изучать asp.net. Пытаюсь сделать простейшую вещь:
Хочу определить объект javascript:
Javascript
1
2
3
4
Temp= {
a:2,
b:5
}
И передать его контроллеру, где уже сложить эти два числа. При этом, у меня есть модель:
C#
1
2
3
4
5
    public class TestModel
    {
        public int Num1 { get; set; }
        public int Num2 { get; set; }
    }
И обратная задача - пусть в контроллере:
C#
1
2
3
string res = string.Empty;
res = (складываем переданные a и b).ToString();
ViewBag.Result = res;
Как теперь передать ViewBag в переменную js?

P.S.: Интересует непосредственно работа с объектами javascript. То есть не добавлять значения value в скрытые input (ведь если наш объект куда сложнее будет, это уже не вариант)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2015, 17:07
Ответы с готовыми решениями:

Как передать параметр из jsp java страницы в функцию javascript и возвратить обратно другой параметр
На jsp странице имеется динамически формируемая таблица с чекбоксами в первой колонке каждой строки...

Как передать данные JavaScript в GET параметр PHP?
в странице есть список сотрудников компании. при клике на определенного сотрудника выходит...

Передать результат работы JavaScript в Java и обратно
приложение у меня с сервлетами, мавеном, jsp. html и обсчитывается через Java есть JSP...

Передать параметр функции javascript в формате Json
Здравствуйте. Запутался с кавычками. Есть виджет, который выводит на карту (яндекс) объекты. при...

21
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 17:30 2
Цитата Сообщение от Siend Ilu Посмотреть сообщение
То есть не добавлять значения value в скрытые input (ведь если наш объект куда сложнее будет, это уже не вариант)
ничего другого не придумали пока. Но вы можете придумать..
Создаётся скрытое поле, с которым вы работаете на js, оно же потом передаётся при постбеке
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 17:34  [ТС] 3
То есть по сути придется парсить объект?
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 17:37 4
Цитата Сообщение от Siend Ilu Посмотреть сообщение
То есть по сути придется парсить объект?
весь парсинг сводится к одной строке кода:
Javascript
1
var obj=JSON.parse(inputValue);
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 17:39  [ТС] 5
ну это если передается одно значение, а если там целый объект? Например массив? Или я чего-то не до понимаю? И это в одну сторону, а в другую как прочитать из этого объекта, не подскажите?)
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 17:47 6
Лучший ответ Сообщение было отмечено Siend Ilu как решение

Решение

Цитата Сообщение от Siend Ilu Посмотреть сообщение
не до понимаю?
да, не понимаете.
Любой сложный объект, который вы передадите в hidden input будет сериализован в json-строку.
Чтобы на js получить этот объект вызывается parse()
Чтобы обратно сериализовать объект на js вызывается
Javascript
1
JSON.stringify(someObject);
1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 18:40  [ТС] 7
Спасибо, стало понятнее, буду пробовать)

Добавлено через 34 минуты
Попытался, но что-то у меня с парсингом не то(
Вот мой контроллер:
C#
1
2
3
4
5
6
7
        public ActionResult Index()
        {
            ViewBag.Result = new int [2];
            ViewBag.Result[0] = 1;
            ViewBag.Result[1] = 2;
            return View();
        }
Вот мой view:

HTML5
1
2
3
4
5
6
        <input id="test" type="hidden" value="@ViewBag.Result" />
 
           <script>
               var test = JSON.parse(document.getElementById("test").value)
               alert (test)
           </script>
Говорит что ошибка в JSON.parse(document.getElementById("test").value)
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 18:58 8
Цитата Сообщение от Siend Ilu Посмотреть сообщение
JSON.parse(document.getElementById("test").value)
без понятия что там у вас не так. Выведите в консоль значение поля test
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 19:14  [ТС] 9
если выводить document.getElementById("test"),то выводит System.Int32[]
А в самом test походу ничего, так как скрипт прерывается ошибкой
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Добавлено через 4 минуты
Судя по всему я что-то не так делаю

<input id="test" type="hidden" value="System.Int32[]" />

Так в браузере выглядит мой инпут. Во вью я его задавал след образом:

<input id="test" type="hidden" value="@ViewBag.Result" />

Судя по всему я просто преобразовал ViewBag.Result к строковому значению, потому и получаю в итоге тип. А как передать все же массив?

Добавлено через 8 минут
Так, я попробовал сделать так:
HTML5
1
<input id="test" type="hidden" value=JSON.stringify(@ViewBag.Result) />
Но получил в value:
HTML5
1
<input id="test" type="hidden" value=JSON.stringify(System.Int32[]) />
Я так понимаю что нужно еще раньше преобразовывать объект в JSON строку. Попробовал переделать контроллер вот таким образом:
C#
1
2
3
4
5
6
7
8
9
10
      
  public ActionResult Index()
        {
            
            int [] Arr = new int [2];
            Arr[0] = 1;
            Arr[1] = 2;
            ViewBag.Result = JSON.stringify(Arr);
            return View();
        }
Но он не понимает JSON. Нужна ли на него директива для сборки? Сейчас у меня используются:
C#
1
2
3
4
5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 19:19 10
Siend Ilu,
вот так попробуйте:
C#
1
ViewBag.Result = JSON(Arr);
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 19:22  [ТС] 11
Тоже не помогает. Говорит что JSON не существует в данном контексте, ну как если бы не было директивы на сборку. А его вообще можно использовать то в c#? или только в коде javascript?
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 19:30 12
Цитата Сообщение от Siend Ilu Посмотреть сообщение
Говорит что JSON
Json это метод контроллера.
Напишите Json, вместо заглавных
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 19:42  [ТС] 13
В контролере:
Подключил:
C#
1
using System.Web.Helpers;
Изменил:
C#
1
ViewBag.Result = Json(Arr);
Ошибки пропали, нормально хавает.

Во view:
HTML5
1
<input id="test" type="hidden" value=@ViewBag.Result />
Отображается в браузере вот таким вот образом:
HTML5
1
<input id="test" value="System.Web.Mvc.JsonResult" type="hidden">
Меня это смущает, потому что по сути то должно это выглядеть иначе...
Соответственно дальше скрипт снова падает на
Javascript
1
var test = JSON.parse(document.getElementById("test").value)
с ошибкой:
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Если изменит на
Javascript
1
var test = Json.parse(document.getElementById("test").value)
то ошибка будет
ReferenceError: Json is not defined

Я так понимаю что все же вот тут:
HTML5
1
<input id="test" value="System.Web.Mvc.JsonResult" type="hidden">
value должен как то иначе выглядеть(
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 20:56 14
Siend Ilu, в общем, так сделайте в контроллере:
C#
1
ViewBag.Result=new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Arr);
1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 21:10  [ТС] 15
YES!!! Это сработало, смог в javascript'e получить свою переменную. А как теперь в обратную сторону отправить?

Вот что я делаю:
HTML5
1
2
3
4
5
6
7
8
9
10
11
 @using (Html.BeginForm("Index","Test")) { 
        <input type="submit" onclick=""/>
        <input id="test" type="hidden" value="" />            
        }
        <script>
            var obj = {
                        a: 1,
                        b: 2
                    }
            document.getElementById("test").value = JSON.stringify(obj)
        </script>
Что мне добавить, чтобы по нажатию на кнопку выполнялась функция, в которой ViewBag.Result присваивалось значение value скрытого инпута, и как после этого его десериализовать?

Контроллер на пост запрос пока выглядет так:
C#
1
2
3
4
5
        [HttpPost]
        public ActionResult Index()
        {
            return View();
        }
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 21:32 16
Цитата Сообщение от Siend Ilu Посмотреть сообщение
Что мне добавить, чтобы по нажатию на кнопку выполнялась функция, в которой ViewBag.Result
ViewBag вам никак не вернётся.
Вам нужно в пост методе добавить входной строковый параметр такого же имени как и name (не id, а name) у input'a.
После чего эту строку вы сможете десериализовать в объект JavaScriptSerializer'ом
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 21:57  [ТС] 17
А какого он будет типа?
Во view добавил имя для инпута:
HTML5
1
<input id="test" type="hidden" value="" name="testInp" />
В контроле делаю так:
C#
1
2
3
4
5
        [HttpPost]
        public ActionResult Index(testInp)
        {
            return View();
        }
Но понятно что я не правильно передаю параметр, только я не знаю как правильно это сделать ><
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
09.01.2015, 22:43 18
Цитата Сообщение от Siend Ilu Посмотреть сообщение
А какого он будет типа?
я же писал
Цитата Сообщение от Монфрид Посмотреть сообщение
входной строковый параметр
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 80
09.01.2015, 23:38  [ТС] 19
Точно, сори за невнимательность. Исправил вот так:
C#
1
2
3
4
5
6
        [HttpPost]
        public ActionResult Index(string testInp)
        {
            var obj = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize(testInp);
            return View();
        }
но что-то я не то указал, потому что компилятор выдает ошибку:
Аргументы-типы для метода "System.Web.Script.Serialization.JavaScriptSerializer.Deserialize<T>(string) " не должны определяться по использованию. Попытайтесь явно определить аргументы-типы.
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
10.01.2015, 09:39 20
Цитата Сообщение от Siend Ilu Посмотреть сообщение
компилятор выдает ошибку:
каким образом он должен понять в какой тип ему преобразовать строку? там есть generic метод, его и используйте
0
10.01.2015, 09:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2015, 09:39
Помогаю со студенческими работами здесь

Передать параметр с html формы другой странице по id , javascript
Передать параметр с html формы другой странице по id , javascript Суть такая есть две страницы...

Передать инфу контроллеру
Всем привет! ^_^ Крч у меня есть страница, в которую передается книга и выводится инфа что ето...

Передать выбранное значение из списка контроллеру
Добрый день &lt;fieldset&gt; Movie Type &lt;select id=&quot;MovieType&quot; name=&quot;MovieType&quot;&gt; ...

Как передать функцию в массив и обратно
Как передать функцию в массив и обратно


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru