Можно ли включить javascript в представление, отображаемое с помощью ajax, в asp mvc 4?

У меня серьезные проблемы с попыткой включить javascript в частичное представление с помощью asp mvc 4, читая этот пост Я следовал инструкциям, чтобы создать пользовательский помощник Html, чтобы включить js. К сожалению, либо я вызываю его из макета, а затем метод фактического включения Javascript никогда не вызывается вовремя (это означает, что запрос страницы уже был вызван, когда я делаю запрос ajax), либо я пытаюсь включить его в свой частичный View, но частичные представления, кажется, автоматически удаляют любой написанный в них javascript. Поэтому я попытался отобразить стандартное представление, но даже это не решило проблему. Дело в том, возможно ли вообще отображать javascript в представлении, вызываемом с помощью ajax в asp mvc? Кто-нибудь делал, подскажите. На самом деле мне нужно запустить javascript в моем представлении «вызывается ajax», потому что я должен обнаруживать значения внутри формы, которая находится внутри этого представления. Я не буду публиковать код помощника, потому что он полностью взят из упомянутого поста. Спасибо!

Хорошо, я постараюсь быть более конкретным, почему я думаю, что мне нужен javascript в моем конкретном представлении. Ниже приведен код основного представления:

    @model MvcCursosSSP.Models.CursosModel
@using System.Threading;
@{

    ViewBag.Title = "AgregarHorario";
    Layout = "~/Views/Shared/_Layout.cshtml";
    int numhoras = ViewBag.NumeroHoras;
    int dias = ViewBag.Dias;
    System.Globalization.CultureInfo culture = Thread.CurrentThread.CurrentCulture;
}

<h2>AgregarHorario</h2>
<table class="horario">
    <colgroup>
        <col id="col1">
        <col id="col2">
        <col id="col3">
        <col id="col4">
        <col id="col5">
        <col id="col6">
    </colgroup>
    <caption>@if (ViewBag.Modulo != null)
             {
                 <text>Modulo </text>@ViewBag.Modulo[0].NumModulo.ToString()<br />@ViewBag.Modulo[0].Nombre.ToString()<br />
             }Horario del @Model.FechaInicio.Day.ToString() de @Model.FechaInicio.ToString("MMMM", culture) al @Model.FechaTermino.Day.ToString() de @Model.FechaTermino.ToString("MMMM", culture)</caption>
    <thead>
        <tr><th>Horario</th>
        @for (int i = 0; i <= @dias; i++)
        {
            <th>@Model.FechaInicio.AddDays(i).ToString("dddd", culture)&nbsp;@Model.FechaInicio.AddDays(i).Day.ToString()</th>
        }
        </tr>
        </thead>
        <tbody>
            @for (int i = 0; i <= @numhoras; i++)
            {
                var newTime = @Model.HorarioInicio.Add(new TimeSpan(i, 0, 0));
                <tr><td>@newTime.Hours:00</td>@for (int j = 0; j <= @dias; j++)
                                                 {
                                                 <td id="@newTime.Hours" rel="@Model.FechaInicio.AddDays(j).Day.ToString()"><span class="addHorario">AgregarHorario</span></td>
                                                 }
                </tr>
            } 
        </tbody>
    </thead>
    </table>
@section scripts {
<script type="text/javascript">
    $('span.addHorario').click(function () {
        var td = $(this).parent('td');
        td.load("/Cursos/CreateMateria/" + new Date(@Model.FechaInicio.Year.ToString(), @Model.FechaInicio.Month.ToString(), td.attr('rel')).toISOString().substring(0,10) + '/' + td.attr('id'));
    });
    $('button[id^="save"]').click(function () {
        horaini = $('#horarioInicio'+$(this).attr('id').substring(4, $(this).attr('id').length)).val();
        horafin = $('#horarioFin'+$(this).attr('id').substring(4, $(this).attr('id').length)).val();
        alert(parseInt(horafin)-parseInt(horaini));
    });
</script>
}

Но окончательный javascript, начинающийся со строки: $('button[id^="save"]').click, не работает, я думаю, потому что дом уже построен, а jquery ничего не распознает. Может ли кто-нибудь предложить решение?


person gerardo flores    schedule 02.03.2015    source источник
comment
Скрипты должны быть в основном представлении или макете, а не в частичном представлении, но как вы думаете, зачем вам нужен html-помощник для этого?   -  person    schedule 02.03.2015
comment
Извините, прочитав следующий комментарий, я пытался отредактировать этот, но наконец опубликовал еще один. Мне интересно, как запустить javascript, когда дом уже изменился из-за вызова ajax?   -  person gerardo flores    schedule 02.03.2015
comment
Я настроил скрипку, чтобы проиллюстрировать это [ссылка]jsfiddle.net/t97Lue3m/2 Думаю, я нужно, чтобы javascript запускался в моем частичном представлении, чтобы он работал правильно, иначе вызов document.ready уже прошел. Я ошибся?   -  person gerardo flores    schedule 02.03.2015
comment
Если в вашем основном представлении есть функция ajax для динамической загрузки частичного представления, вы используете делегирование событий, например. $(document).on('click', '#someElement', function() { // do something }); В идеале замените document ближайшим предком, который существует на момент первого рендеринга представления, а #someElement в вашем случае может быть .someClassName (а не 'button[id^="save"]')   -  person    schedule 02.03.2015
comment
Извините, похоже, вы думали о том же, что и я, когда публиковал свой ответ. Хотя ни у кого идею никто не украл. Я сделал, как ты сказал. Спасибо :)   -  person gerardo flores    schedule 02.03.2015


Ответы (1)


Неважно, я решил это. Похоже, у Jquery уже есть решение для этого, просто добавив функцию обратного вызова к загрузке следующим образом:

$('span.addHorario').click(function () {
    var td = $(this).parent('td');
    td.load("/Cursos/CreateMateria/" + new Date(@Model.FechaInicio.Year.ToString(), @Model.FechaInicio.Month.ToString(), td.attr('rel')).toISOString().substring(0,10) + '/' + td.attr('id'), function(){
        $('button[id^="save"]').click(function () {
            horaini = $('#horarioInicio'+$(this).attr('id').substring(4, $(this).attr('id').length)).val();
            horafin = $('#horarioFin'+$(this).attr('id').substring(4, $(this).attr('id').length)).val();
            alert(parseInt(horafin)-parseInt(horaini));
        });   
    });
});

и теперь я могу манипулировать домом моего частичного представления. Спасибо!

person gerardo flores    schedule 02.03.2015