Как использовать переменную C # внутри блочной переменной javascript, используя Razor? - PullRequest
3 голосов
/ 30 сентября 2011

У меня есть файл представления (.cshtml) с этим блоком C # в верхней части файла:

@{
List<string> selectedCategories = new List<string>();

}

хорошо, я хочу использовать список selectedCategories в следующем блоке javascript

@section scripts{
<script src="../../Scripts/jquery-1.6.4-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#list-all-categories").selectable({
            stop: function () {
                var result = $("#selectedCategories").empty();
                @selectedCategories.Clear()
                $(".ui-selected", this).each(function () {
                    var Mytext = $(this).text();

                    @selectedCategories.Add(Mytext.toString());

                });

            }
        });
    });
</script>

}

ТАК, это не работает! ... вообще !!!

У меня есть некоторые ошибки, подобные этой: -Кондиционная компиляция отключена -Имя 'Mytext' не существует в текущем контексте -...

что мне делать ?! Помогите мне, пожалуйста!

Ответы [ 3 ]

5 голосов
/ 30 сентября 2011
  • Javascript запускается в браузере.
  • Код бритвы запускается на веб-сервере

Вы не можете их так смешивать.

Вам нужно создать элементы формы, используя только jQuery, а затем отправить их обратно на сервер.

<script type="text/javascript">
    $(document).ready(function () {
        $("#list-all-categories").selectable({
            stop: function () {
                $(".selectedItems").remove();
                $(".ui-selected", this).each(function () {
                var Mytext = $(this).text();
                $('#myform').append('<input type="hidden" name="selectedCategory" value="' + MyText + '" class="selectedItems" />');
            });
        });
    });
</script>

замените "myform" на форму, которая публикуется.

И тогда вы получитеэлементы как:

public ActionResult YourAction(string[] selectedCategory)
{
}
1 голос
/ 30 сентября 2011

Код Razor запускается веб-сервером в процессе построения текста, и в этот момент Javascript представляет собой просто текст.

Razor просто облегчает чтение этого материала, но на самом деле он просто сочетает выполнение сервера сблоки строкового текста.

Ваш пример фактически делает это:

Response.Write(@"
<script src=""../../Scripts/jquery-1.6.4-vsdoc.js"" type=""text/javascript""></script>
<script type=""text/javascript"">
$(document).ready(function () {
    $(""#list-all-categories"").selectable({
        stop: function () {
            var result = $(""#selectedCategories"").empty();");

Response.Write( selectedCategories.Clear() );

Response.Write(@"$("".ui-selected"", this).each(function () {
                var Mytext = $(this).text();");

Response.Write( selectedCategories.Add(Mytext.ToString()));

Response.Write(@"});

        }
    });
});
</script>");

Таким образом, вы получаете исключение компиляции на Mytext, потому что он не существует на стороне сервера - все это Javascriptпросто текстовые строки на стороне сервера .Net код.

1 голос
/ 30 сентября 2011

Проблема в том, что выражения бритвы компилируются на стороне сервера, прежде чем веб-страница достигнет веб-браузера. Но JavaScript интерпретируется во время выполнения, на стороне клиента. Поэтому вы не можете добавлять вещи в c # -лист из JavaScript, как это.

Возможно, если вам нужно поддерживать c # -лист в бэкэнде, вы можете выполнить действие на контроллере, на который вы можете отправлять элементы через Ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...