Biorąc pod uwagę następujące klasy i metodę akcji kontrolera:
public School
{
public Int32 ID { get; set; }
publig String Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street1 { get; set; }
public string City { get; set; }
public String ZipCode { get; set; }
public String State { get; set; }
public String Country { get; set; }
}
[Authorize(Roles = "SchoolEditor")]
[AcceptVerbs(HttpVerbs.Post)]
public SchoolResponse Edit(Int32 id, FormCollection form)
{
School school = GetSchoolFromRepository(id);
UpdateModel(school, form);
return new SchoolResponse() { School = school };
}
I następujący formularz:
<form method="post">
School: <%= Html.TextBox("Name") %><br />
Street: <%= Html.TextBox("Address.Street") %><br />
City: <%= Html.TextBox("Address.City") %><br />
Zip Code: <%= Html.TextBox("Address.ZipCode") %><br />
Sate: <select id="Address.State"></select><br />
Country: <select id="Address.Country"></select><br />
</form>
Jestem w stanie zaktualizować zarówno instancję School, jak i członka Address szkoły. To całkiem miłe! Dziękuję zespołowi ASP.NET MVC!
Jak jednak użyć jQuery, aby wybrać listę rozwijaną, aby móc ją wstępnie wypełnić? Zdaję sobie sprawę, że mógłbym zrobić to po stronie serwera, ale na stronie będą inne dynamiczne elementy, które mają wpływ na listę.
Oto, co mam do tej pory i nie działa, ponieważ selektory wydają się nie pasować do identyfikatorów:
$(function() {
$.getJSON("/Location/GetCountryList", null, function(data) {
$("#Address.Country").fillSelect(data);
});
$("#Address.Country").change(function() {
$.getJSON("/Location/GetRegionsForCountry", { country: $(this).val() }, function(data) {
$("#Address.State").fillSelect(data);
});
});
});
javascript
jquery
jquery-selectors
Doug Wilson
źródło
źródło
Odpowiedzi:
Z Grup dyskusyjnych Google :
Więc myślę, że patrzysz
Zobacz także Jak wybrać element według identyfikatora, który ma znaki używane w notacji CSS? w FAQ jQuery.
źródło
Nie możesz użyć selektora identyfikatora jQuery, jeśli identyfikator zawiera spacje. Użyj selektora atrybutu:
Jeśli to możliwe, określ również typ elementu:
źródło
Escape it for Jquery:
przykład użycia:
więcej informacji tutaj .
źródło
Kandydat do wydania ASP.NET MVC, który właśnie został wydany, rozwiązał ten problem, teraz zastępuje kropki podkreśleniami dla atrybutu ID.
Renderuje do
Więcej informacji można znaleźć w uwagach do wydania, począwszy od strony 14.
źródło
Jest to udokumentowane w dokumentacji jQuery Selectors :
W skrócie, prefiks
.
z\\
następująco:Dlaczego nie
.
działa w moim ID?Problem polega na tym, że
.
ma specjalne znaczenie, następujący po nim ciąg jest interpretowany jako selektor klasy. Więc$('#Address.Country')
pasuje<div id="Address" class="Country">
.Jeśli zmienisz znaczenie jako
\\.
, kropka będzie traktowana jak zwykły tekst bez specjalnego znaczenia, pasujący do żądanego identyfikatora<div id="Address.Country">
.Dotyczy to wszystkich znaków,
!"#$%&'()*+,./:;<=>?@[\]^`{|}~
które w innym przypadku miałyby specjalne znaczenie jako selektor w jQuery. Po prostu dodawaj\\
z wyprzedzeniem, aby traktować je jak zwykły tekst.Dlaczego 2
\\
?Jak zauważono w odpowiedzi bdukes, potrzebujemy 2
\
znaków.\
spowoduje zmianę znaczenia następującego znaku w JavaScript. Tak więc, gdy JavaScript zinterpretuje ciąg"#Address\.Country"
, zobaczy\
, zinterpretuje to tak, że weźmie następujący znak literalnie i usunie go, gdy łańcuch zostanie przekazany jako argument do$()
. Oznacza to, że jQuery nadal będzie widzieć ciąg jako"#Address.Country"
.Tutaj
\
do gry wkracza drugi . Pierwsza z nich mówi JavaScriptowi, aby zinterpretował drugą jako znak dosłowny (nie specjalny). Oznacza to, że drugi będzie widoczny dla jQuery i zrozumie, że następny.
znak jest znakiem dosłownym.Uff! Może możemy to sobie wyobrazić.
źródło
Używając dwóch odwrotnych ukośników jest w porządku, działa. Ale jeśli używasz nazwy dynamicznej, mam na myśli nazwę zmiennej, będziesz musiał zastąpić znaki.
Jeśli nie chcesz zmieniać nazw zmiennych, możesz to zrobić:
i niż masz swój obiekt jquery.
źródło
Tylko dodatkowe informacje: sprawdź ten problem dotyczący ASP.NET MVC nr 2403 .
Dopóki problem nie zostanie rozwiązany, używam własnych metod rozszerzających, takich jak Html.TextBoxFixed itp., Które po prostu zastępują kropki podkreśleniami w atrybucie id (nie w atrybucie nazwy), więc używam jquery, takiego jak $ ("# Address_Street") ale na serwerze jest to jak Address.Street.
Przykładowy kod jest następujący:
źródło
Rozwiązałem problem za pomocą rozwiązania podanego przez jquery docs
Moja funkcja:
Uwaga: usuwam znak „#”, ponieważ w swoim kodzie łączę identyfikator z innym tekstem
Czcionka: Jquery Docs wybiera element ze specjalnymi znakami
źródło