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('txtPayAmount').value = document.getElementById('drpdownPayPlan').value.replace(',', '');">
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 № 1The 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:
Przydzielać
ClientIDMode="Static"
do każdej zaangażowanej kontroli serwera (założyłem, żetxtPayAmount
jestTextBox
kontrola serwera, jeśli używasz dosłownego wprowadzania tekstu, zostaw poletxtPayAmount
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.Posługiwać się
<%= drpdownPayPlan.ClientID %>
odsyłanie identyfikatora po stronie klienta przy zachowaniu identyfikatorów kontroliAutoID
stan (znowu założyłemtxtPayAmount
jestTextBox
kontroluj tutaj, zostaw to jeślitxtPayAmount
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: