Jquery добавляет MVC PartialView со сценариями

У меня есть функция javascript, которая добавляет PartialView в div. Все работает нормально, за исключением того, что PartialView содержит несколько <script></script> скриптов. И эти динамически добавленные функции не найдены jQuery - Uncaught ReferenceError: getIDc4 is not defined.

Моя функция JS

var url = '@UrlHelper.GetFullUrl("Inventories/GetFilterRow")'; //this returns partial view
        $.ajax({
            type: 'POST',
            data: { aRef: aRef },
            url: url,
            success: function(data) {
                $('.filter').append($(data)[0]);
                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.src = url;
            }
        });

и частичный вид

...
@{
    int id = Model != null ? Model.Id : 1;
}

<div id="@Html.Raw("FilterCondition" + id)">
...
...
...

    @{
        string getIdcFunction = string.Format("getIDc{0}", id);
    }
    <script>
        @{
            @:function  
                @getIdcFunction<text>() {
            var grid = $("@Html.Raw("#field"+id)").data("kendoDropDownList");
            var item = grid.value();
            return { IDc: item };
        }
            </text>
        }
    </script>

</div>

Как я могу заставить эти динамически добавленные функции работать?

Когда я создаю частичное представление, используя загрузку страницы с помощью

@Html.Partial("GetFilterRow", new {Id = 1})

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

Спасибо за помощь.


person Maarty    schedule 22.10.2015    source источник
comment
Никогда не помещайте скрипты в частичные файлы. Поместите их в основной вид или макет   -  person    schedule 22.10.2015
comment
да, но в этом случае мне это нужно... Есть ли какой-нибудь обходной путь, чтобы заставить это работать?   -  person Maarty    schedule 22.10.2015
comment
Как вы думаете, зачем вам это нужно? Что вы пытаетесь сделать?   -  person    schedule 22.10.2015
comment
ну, мне нужно сгенерировать функцию с такими именами, как name1, name2, name3... причина в том, что внешний компонент, который я использую, не поддерживает параметры функции для обратного вызова, поэтому я не могу просто вызвать name(id ), я могу указать только имя функции, поэтому для каждого компонента я создаю новую функцию.... это некрасиво, но я не вижу другого обходного пути   -  person Maarty    schedule 22.10.2015
comment
Содержит ли внешний компонент ссылку на исходный элемент? Возможно, вы могли бы использовать jQuery $.data() для установки пользовательских данных для каждого элемента, а затем получить их в обратном вызове? Изменить: вы также можете попробовать переместить скрипт за пределы тега ‹div› и присвоить ему type=text/javascript. jQuery должен автоматически анализировать теги сценария. Взгляните на jQuery.unobtrusive-ajax.js от Microsoft, чтобы увидеть пример того, как они обрабатывают Ajax.ActionLink. Скрипты в Partial Views, использующие этот метод, прекрасно анализируются и выполняются.   -  person Michael Gagne    schedule 22.10.2015
comment
похоже, что JS, который вы написали с помощью бритвы, неверен. можете показать отрендеренный JS?   -  person J Santosh    schedule 23.10.2015
comment
@JSantosh, JS должен быть в порядке, когда я визуализирую его с помощью PartialView, он работает. Единственная проблема в том, что когда я добавляю его с помощью ajax и jQuery, функции не найдены...   -  person Maarty    schedule 23.10.2015
comment
@MichaelGagne, не могли бы вы дать мне ссылку на эти примеры? Благодарность   -  person Maarty    schedule 23.10.2015
comment
Наконец, я нашел другой обходной путь, как работать с этими компонентами без необходимости создавать новые функции в PartialView... в любом случае мне все еще интересно, возможно ли это как-то   -  person Maarty    schedule 23.10.2015


Ответы (2)


У вас есть несколько вариантов, о которых я знаю. Первый вариант — включить ваш скрипт в главное представление и установить onclick или любое другое событие, которое вы пытаетесь вызвать, для вызова этой функции.

Например, в вашем основном представлении есть:

function floorSelect(clickedFloor) {
         doStuff;
         }

И в вашем частичном представлении есть:

    <ul class="dropdown-menu" role="menu" aria-labeledby="dropDownSelectFloor">
                @For i As Integer = 0 To Model.ListOfFloors.Count - 1
                    @<li role="presentation"><a id="ddListSelectFloor" class="ddListSelectFloor" 
                     onclick="floorSelect(this)" role="menuitem" tabindex="-1">
                     @Model.ListOfFloors(i)</a>
                        </li>
                    Next
                </ul>

Обратите внимание на onClick, который вызывает скрипт из главного окна.

Вариант номер 2 - прикрепить скрипт через id (наверное можно сделать и на class)

Нравится:

@For i As Integer = 0 To Model.ListOfDisplayTypes.Count - 1
                If Model.ListOfDisplayTypes(i).Equals("DatePicker") Then
                @<div class="row">
                    <div class="col-md-4">
                        <b>@Model.ListOfFields(i): </b>
                    </div>
                    <div class="col-md-4">
                        <input class="search" id="@Model.ListOfCategoryAttributeIDs(i)" type="text" placeholder="@Model.ListOfFields(i)">
                    </div>
                    <script>
                        jQuery("input[id='@Model.ListOfCategoryAttributeIDs(i)']").datepicker();
                    </script>
                </div>
                End If
            Next
person rogerdeuce    schedule 22.10.2015

1. Поместите скрипты в частичном представлении в файл scripts.js. 2. После добавления частичного представления в div используйте $.getscripts('path of scripts.js').

person Sriman Saswat Suvankar    schedule 23.10.2015
comment
хорошая идея . но это не сработает, потому что OP пишет JS в бритве. проверьте OP один раз, вы можете увидеть текстовые теги. так что это не просто JS, это что-то вроде динамического кода JS - person J Santosh; 23.10.2015