Nie działające zdarzenie jQuery

0

Witam, piszę w asp.net taki skrypt do edycji harmonogramu mszalnego. I pojawił mi się taki problem, że po jednorazowym pobraniu danych przez ajax wszystkie zdarzenia ajax przestają działać. Kod wygląda tak:

Główny widok odpowiedzialny za wyświetlanie wszystkich dni:

 @{var MassContext = new JakubCMF.Models.DatabaseContext();}
<h1>Edytuj harmonogram nabożeństw</h1>
@for (int i = 0; i < 7; i++)
{
    var DayMasses = from a in MassContext.MassHoursSchedule where a.DayId == i orderby a.Time select a;
    <div class="MassScheduleSection">
        <h2>@JakubCMF.CalendarFunctions.GetStringDay(i)</h2>
        <table class="table table-bordered table-striped">
            <thead>
                <tr class="TableLabel">
                    <th>Godzina</th>
                    <th>Nabożeństwo</th>
                    <th colspan="2">Akcja</th>
                </tr>
            </thead>
            <tbody id="DayMass-@i">
                @{Html.RenderPartial("_ShowDayMass", DayMasses.ToList<JakubCMF.Models.MassHoursSchedule>());}
            </tbody>
            <tfoot>
                <tr>
                    @using (Ajax.BeginForm("Add", "Mass", new AjaxOptions() { UpdateTargetId = ("DayMass-" + i) }))
                    {
                        <td>
                            @Html.AntiForgeryToken()
                            <input name="DayId" type="hidden" value="@i" />
                            <input type="time" name="Time" />
                        </td>
                        <td><input type="text" name="Label" /></td>
                        <td colspan="2"><input type="submit" value="Dodaj" /></td>
                    }
                </tr>
            </tfoot>
        </table>
    </div>
}

Widok częściowy odpowiedzialny za wyświetlenie danego dnia:

@model List<JakubCMF.Models.MassHoursSchedule>
@if (Model != null)
{
    foreach (var a in Model)
    {
        <tr>
            <form action="/Mass/Update" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#[email protected]" id="form2" method="post" novalidate="novalidate">
            @using (Ajax.BeginForm("Update", "Mass", new AjaxOptions() { UpdateTargetId = ("DayMass-" + a.DayId) }))
            {
                <td>
                    @Html.AntiForgeryToken()
                    <input name="DayId" type="hidden" value="@a.DayId" />
                    <input name="Id" type="hidden" value="@a.Id" />
                    <input type="time" value="@a.Time.ToString(@"hh\:mm")" name="Time" />
                </td>
                <td><input type="text" name="Label" value="@a.Label" /></td>
                <td><input type="submit" value="Aktualizuj" /></td>
            }
            </form>
            @using (Ajax.BeginForm("Remove", "Mass", new AjaxOptions() { UpdateTargetId = ("DayMass-" + a.DayId)}))
            {
                <td>
                    @Html.AntiForgeryToken()
                    <input name="Id" type="hidden" value="@a.Id" />
                    <input type="submit" value="Usuń" />
                </td>
            }
        </tr>
    }
}

I jeszcze widok kontrolera, ale nie wiem czy się do czegoś przyda:

 
        //
        // POST: /Mass/Add
        [HttpPost]
        [ValidateAntiForgeryToken]
        [Authorize(Roles = "Admin")]
        public ActionResult Add(Models.MassAdd Model)
        {
            if (ModelState.IsValid)
            {
                var Mass = new Models.MassHoursSchedule();
                Mass.DayId = Model.DayId;
                Mass.Label = Model.Label;
                Mass.Time = Model.Time;
                Database.MassHoursSchedule.Add(Mass);
                try
                {
                    Database.SaveChanges();
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException)
                {

                }
            }
            var Result = from a in Database.MassHoursSchedule where a.DayId == Model.DayId orderby a.Time select a;
            return PartialView("_ShowDayMass", Result.ToList<MassHoursSchedule>());
        }

I problem pojawia się po aktualizacji widoku częściowego. Formularze przestają działać. W jaki sposób mogę to naprawić??

1

Po wykonaniu ajaxa - przypnij zdarzenia jeszcze raz (tylko do nowych elementów).
Albo dodając zdarzenia - używaj "on" (dawniej "live"). Jak to przenieść do ASP.NEt to nie wiem

0

A w jaki sposób mogę wywołać tą funkcję w js(dodać zdarzenie)??

(function ($) {
    var data_click = "unobtrusiveAjaxClick",
        data_target = "unobtrusiveAjaxClickTarget"
    data_validatio
//reszt funkcji
    function SubmitAjaxForm(evt) {
        alert("adam");
        var clickInfo = $(this).data(data_click) || [],
            clickTarget = $(this).data(data_target),
            isCancel = clickTarget && clickTarget.hasClass("cancel");
        evt.preventDefault();
        if (!isCancel && !validate(this)) {
            return;
        }
        asyncRequest(this, {
            url: this.action,
            type: this.method || "GET",
            data: clickInfo.concat($(this).serializeArray())
        });
    }
}(jQuery));
0

Bo te zdarzenia są dodawane metodą on, jak napisał @dzek69, ale i tak nie działają, więc co zrobić??

1
Adam Programmer napisał(a):
 
    foreach (var a in Model)
    {
        <tr>
            <form action="/Mass/Update" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#[email protected]" id="form2" method="post" novalidate="novalidate">
            @using (Ajax.BeginForm("Update", "Mass", new AjaxOptions() { UpdateTargetId = ("DayMass-" + a.DayId) }))
            {

Ten kawalek kodu jest niepoprawny. w petli generujesz formularze ktore maja takie same "id" i do tego po dwa razy na iteracje, gdyz raz jako "<form action" a drugi raz za pomoca "Ajax.BeginForm".

Podejrzyj sobie wygenerowany kod w przegladarce. Notabene konsola tez Ci powinna to chyba pokazac.

0

poprawiłem ten błąd, ale nie miał on znaczenia jeśli chodzi o te zdarzenia. Co jeszcze może być nie tak??

0

Ewentualnie, może poradzilibyście mi w jaki inny sposób to zrobić?? np. json, czy jak inaczej??

0

no nie mogę, częściowym rozwiązaniem mojego problemu była zmiana widoku częściowego danego dnia:

@model List<JakubCMF.Models.MassHoursSchedule>
@if (Model != null)
{
    foreach (var a in Model)
    {
        <tr>
            @using (Ajax.BeginForm("Update", "Mass", new AjaxOptions { UpdateTargetId = ("DayMass-" + a.DayId) }))
            {
                <td>
                    @Html.AntiForgeryToken()
                    <input name="DayId" type="hidden" value="@a.DayId" />
                    <input name="Id" type="hidden" value="@a.Id" />
                    <input type="time" value="@a.Time.ToString(@"hh\:mm")" name="Time" />
                </td>
                <td><input type="text" name="Label" value="@a.Label" /></td>
                <td><input type="submit" value="Aktualizuj" /></td>
            }
            <td>
                @using (Ajax.BeginForm("Remove", "Mass", new AjaxOptions { UpdateTargetId = ("DayMass-" + a.DayId) }))
                {
                    @Html.AntiForgeryToken()
                    <input name="Id" type="hidden" value="@a.Id" />
                    <input type="submit" value="Usuń" />
                }
            </td>
        </tr>
    }
}

usuwanie danego rekordu działa, natomiast aktualizacja jeszcze nie działa, może teraz będzie ktoś wiedział co zrobić?? :D

0

Czy ktoś chociaż może polecić mi jakieś dobre kursy, materiały, publikacje wyczerpujące temat ajax.beginform() ??

1

ALe blad jest wciaz ten sam. formularze ktore generujesz za pomoca partialview po pierwsze nie sa unikalne bo maja zdublowane id (DayMass-" + a.DayId, gdzie DayId jest takie samo dla wszystkich wpisow wtym dniu), a druga sprawa, nie tworzysz formularzy w srodku wiersza. Gdybys posluchaj mnie od razu i zajrzal do kodu jaki ci sie wygenerowal to znalazbys od razu duplikaty id i zobaczylbys ze form zamyka sie zaraz za tym jak sie otwiera, iwec te wszystkie twoje inputy i przyciski nie sa w formularzu.

przekopiowalem twoj kod do siebie i po utworzeniu brakujeacego modelu wszystko chodzi, jesli id jest unikalne i jesli form jest w TD a nie w TR, ew dla kazdego wiersza rob nowa tabele i ja ogarnij formem, lub przerzuc sie na divy.

//Edit
i jeszcze mi sie przypomnialo, ze nie wyciagaj contextu do widoku , nawet nie do kontrolera. zamknij go w jakims service to latwiej to bedzie ogarniac

1 użytkowników online, w tym zalogowanych: 0, gości: 1