/ / Jak uparcie trzymać stary moduł obsługi zdarzeń JavaScript na stronie internetowej przeniesionej do ASP.NET MVC? - javascript, asp.net-mvc, obsługa zdarzeń, portowanie

Jak z uporem zachować starą obsługę zdarzeń JavaScript w stronie formularza internetowego przeniesionej do ASP.NET MVC? - javascript, asp.net-mvc, obsługa zdarzeń, portowanie

Biorąc pod uwagę pojedynczą linię znaczników w pliku .ASPX w następujący sposób:

<asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="javascript: document.getElementById("txtPayAmount").value = document.getElementById("drpdownPayPlan").value.replace(",", "");">

Czy mogę zachować mój kod obsługi JavaScripti jak? Rozumiem, że istnieje wiele innych problemów podczas przenoszenia aplikacji WebForms do ASP.NET MVC, ale chciałbym, aby było to proste i skupiłem się na tej jednej linii. Obecnie błąd, który otrzymuję w tej linii, to:

Nieobsługiwany wyjątek w wierszu 410, kolumna 115 cali http://localhost:3835/Policy/QuotePayments?QN=XYZ-1234567&PN=ABCDEFGHIJ&AC=123456789

0x800a138f - Błąd czasu wykonania JavaScript: Nie można uzyskać „wartości” właściwości niezdefiniowanego lub zerowego odniesienia

Podczas renderowania kod źródłowy w wierszu 410 brzmi następująco (rozumiem przyczynę zniekształconych nazw):

    <select name="ctl00$MainContent$drpdownPayPlan" id="MainContent_drpdownPayPlan" onchange="javascript: document.getElementById(&#39;txtPayAmount&#39;).value = document.getElementById(&#39;drpdownPayPlan&#39;).value.replace(&#39;,&#39;, &#39;&#39;);">

Z całym szacunkiem - bez dawania mikazanie o tym, jak prawidłowo przenieść projekt WebForms do MVC (przepraszam, że brzmi jak zbuntowany i niechętny do współpracy nastolatek!) - jak mogę rozwiązać problem, który mam z tą linią znaczników?

Odpowiedzi:

1 dla odpowiedzi № 1

The 0x800a138f błąd na stronie ASPX często występuje podczas próby przypisania nazwy kontroli po stronie serwera (która nie istnieje po stronie klienta z powodu domyślnego przypisania zachowania kontroli serwera AutoID) zamiast nazwy po stronie klienta document.getElementById("drpdownPayPlan") zwraca undefined.

Istnieją 2 sposoby rozwiązania tego problemu:

  1. Przydzielać ClientIDMode="Static" do każdej zaangażowanej kontroli serwera (założyłem, że txtPayAmount jest TextBox kontrola serwera, jeśli używasz dosłownego wprowadzania tekstu, zostaw pole txtPayAmount jak jest).

    <asp:TextBox ID="txtPayAmount" runat="server" ClientIDMode="Static" />
    <asp:DropDownList ID="drpdownPayPlan" runat="server" ClientIDMode="Static" onchange="javascript: document.getElementById("txtPayAmount").value = document.getElementById("drpdownPayPlan").value.replace(",", "");">
    

    NB: The ClientIDMode atrybut dostępny w .NET w wersji 4.0 i nowszych.

  2. Posługiwać się <%= drpdownPayPlan.ClientID %> odsyłanie identyfikatora po stronie klienta przy zachowaniu identyfikatorów kontroli AutoID stan (znowu założyłem txtPayAmount jest TextBox kontroluj tutaj, zostaw to jeśli txtPayAmount to dosłowne pole tekstowe).

    <asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="javascript: document.getElementById("<%= txtPayAmount.ClientID %>").value = document.getElementById("<%= drpdownPayPlan.ClientID %>").value.replace(",", "");">
    

Zauważ, że zalecam oddzielenie części JS od kontroli serwera w funkcji i wywołanie nazwy funkcji, jak podano poniżej:

<asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="changePayAmount();">

<script type="text/javascript">
function changePayAmount() {
document.getElementById("<%= txtPayAmount.ClientID %>").value = document.getElementById("<%= drpdownPayPlan.ClientID %>").value.replace(",", "");
}
</script>

PS: W kontekście MVC id dla każdego elementu pomocnika HTML można łatwo zdefiniować w części atrybutów HTML w następujący sposób:

@Html.DropDownListFor(model => model.PayPlan, Model.PayPlanList as SelectList, new { id = "drpdownPayPlan" })

Podobne problemy:

0x800a138f - Błąd czasu wykonania JavaScript: Nie można uzyskać „wartości” właściwości niezdefiniowanego lub pustego odwołania

Błąd czasu wykonania JavaScript: Nie można uzyskać „wartości” właściwości niezdefiniowanego lub pustego odwołania