Compte tenu des classes et de la méthode d'action du contrôleur suivantes:
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 };
}
Et la forme suivante:
<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>
Je suis en mesure de mettre à jour à la fois l'instance School et le membre Address de l'école. C'est assez sympa! Merci à l'équipe ASP.NET MVC!
Cependant, comment utiliser jQuery pour sélectionner la liste déroulante afin de pouvoir la pré-remplir? Je me rends compte que je pourrais faire ce côté serveur mais il y aura d'autres éléments dynamiques sur la page qui affecteront la liste.
Ce qui suit est ce que j'ai jusqu'à présent, et cela ne fonctionne pas car les sélecteurs ne semblent pas correspondre aux ID:
$(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
la source
la source
Réponses:
Depuis Google Groupes :
Alors, je suppose que tu regardes
Consultez également Comment sélectionner un élément par un identifiant contenant des caractères utilisés en notation CSS? sur la FAQ jQuery.
la source
Vous ne pouvez pas utiliser un sélecteur d'identifiant jQuery si l'identifiant contient des espaces. Utilisez un sélecteur d'attribut:
Si possible, spécifiez également le type d'élément:
la source
Échappez-vous à Jquery:
exemple d'utilisation:
plus d'infos ici .
la source
La version Release Candidate d'ASP.NET MVC qui vient d'être publiée a résolu ce problème, elle remplace désormais les points par des traits de soulignement pour l'attribut ID.
Rend en
Pour plus d'informations, consultez les notes de mise à jour, à partir de la page 14.
la source
Ceci est documenté dans la documentation de jQuery Selectors :
En bref, préfixez le
.
avec\\
comme suit:Pourquoi ne
.
fonctionne pas dans mon identifiant?Le problème est que cela
.
a une signification particulière, la chaîne suivante est interprétée comme un sélecteur de classe. Donc$('#Address.Country')
correspondrait<div id="Address" class="Country">
.Lorsqu'il est échappé comme
\\.
, le point sera traité comme du texte normal sans signification particulière, correspondant à l'ID souhaité<div id="Address.Country">
.Cela s'applique à tous les caractères
!"#$%&'()*+,./:;<=>?@[\]^`{|}~
qui auraient autrement une signification particulière en tant que sélecteur dans jQuery. Ajoutez-les simplement\\
pour les traiter comme du texte normal.Pourquoi 2
\\
?Comme indiqué dans la réponse de bdukes, il y a une raison pour laquelle nous avons besoin de 2
\
caractères.\
échappera au caractère suivant en JavaScript. Lorsque JavaScript interprète la chaîne"#Address\.Country"
, il verra le\
, l'interprétera comme signifiant prendre le caractère suivant littéralement et le supprimer lorsque la chaîne est transmise comme argument à$()
. Cela signifie que jQuery verra toujours la chaîne comme"#Address.Country"
.C'est là que le second
\
entre en jeu. Le premier indique à JavaScript d'interpréter le second comme un caractère littéral (non spécial). Cela signifie que le second sera vu par jQuery et comprendra que le.
caractère suivant est un caractère littéral.Phew! Peut-être pouvons-nous visualiser cela.
la source
En utilisant deux backslashes c'est ok, ça marche. Mais si vous utilisez un nom dynamique, je veux dire, un nom de variable, vous devrez remplacer des caractères.
Si vous ne souhaitez pas changer les noms de vos variables, vous pouvez le faire:
et que vous avez votre objet jquery.
la source
Juste des informations supplémentaires: consultez ce problème ASP.NET MVC # 2403 .
Jusqu'à ce que le problème soit résolu, j'utilise mes propres méthodes d'extension comme Html.TextBoxFixed, etc. qui remplace simplement les points par des traits de soulignement dans l'attribut id (pas dans l'attribut name), de sorte que vous utilisez jquery comme $ ("# Address_Street") mais sur le serveur, c'est comme Address.Street.
Un exemple de code suit:
la source
J'ai résolu le problème avec la solution donnée par jquery docs
Ma fonction:
Remarque: je supprime le "#" car dans mon code, je concat l'identifiant avec un autre texte
Police: Jquery Docs select élément avec des caractères spéciaux
la source