Dadas as seguintes classes e método de ação do controlador:
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 };
}
E o seguinte formulário:
<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>
Consigo atualizar a instância da escola e o membro de endereço da escola. Isso é muito legal! Obrigado equipe ASP.NET MVC!
No entanto, como uso o jQuery para selecionar a lista suspensa para preenchê-la previamente? Sei que poderia fazer esse lado do servidor, mas haverá outros elementos dinâmicos na página que afetam a lista.
A seguir, é o que tenho até agora e não funciona, pois os seletores parecem não corresponder aos IDs:
$(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
fonte
fonte
Respostas:
Dos Grupos do Google :
Então, eu acho que você está olhando
Verifique também como faço para selecionar um elemento por um ID que possua caracteres usados na notação CSS? no FAQ do jQuery.
fonte
Você não pode usar um seletor de id do jQuery se o id contiver espaços. Use um seletor de atributos:
Se possível, especifique também o tipo de elemento:
fonte
Escape para o Jquery:
exemplo de uso:
mais informações aqui .
fonte
O Release Candidate do ASP.NET MVC que acabou de ser lançado corrigiu esse problema, agora substitui os pontos por sublinhados para o atributo ID.
Renderiza para
Para mais informações, veja as notas de versão, começando na página 14.
fonte
Isso está documentado nos documentos do jQuery Selectors :
Em resumo, prefixe o
.
com da\\
seguinte maneira:Por que não
.
funciona no meu ID?O problema é que
.
tem um significado especial, a sequência a seguir é interpretada como um seletor de classe. Então$('#Address.Country')
combinaria<div id="Address" class="Country">
.Quando escapado como
\\.
, o ponto será tratado como texto normal sem significado especial, correspondendo ao ID que você deseja<div id="Address.Country">
.Isso se aplica a todos os caracteres
!"#$%&'()*+,./:;<=>?@[\]^`{|}~
que, de outra forma, teriam um significado especial como seletor no jQuery. Anexe apenas\\
para tratá-los como texto normal.Por que 2
\\
?Conforme observado na resposta do bdukes, há uma razão pela qual precisamos de 2
\
caracteres.\
escapará do seguinte caractere em JavaScript. Se, quando o JavaScript interpreta a string"#Address\.Country"
, ele vê\
, interpreta-o com o seguinte caractere alfabético e remove -o quando a string é passada como argumento para$()
. Isso significa que o jQuery ainda verá a string como"#Address.Country"
.É aí que o segundo
\
entra para jogar. O primeiro diz ao JavaScript para interpretar o segundo como um caractere literal (não especial). Isso significa que o segundo será visto pelo jQuery e entenderá que o seguinte.
caractere é um caractere literal.Ufa! Talvez possamos visualizar isso.
fonte
Usando duas barras invertidas, tudo bem, está funcionando. Mas se você estiver usando um nome dinâmico, quero dizer, um nome de variável, precisará substituir caracteres.
Se você não quiser alterar os nomes das variáveis, faça o seguinte:
e do que você tem seu objeto jquery.
fonte
Apenas informações adicionais: verifique este problema do ASP.NET MVC # 2403 .
Até que o problema seja resolvido, eu uso meus próprios métodos de extensão, como Html.TextBoxFixed, etc. que simplesmente substituem pontos por sublinhados no atributo id (não no atributo name), para que você use jquery como $ ("# Address_Street") mas no servidor, é como Address.Street.
Código de exemplo a seguir:
fonte
Resolvi o problema com a solução dada pelo jquery docs
Minha função:
Nota: removo o "#" porque no meu código concato o ID com outro texto
Fonte: Jquery Docs seleciona elemento com caracteres especiais
fonte