我如何让jQueryselect一个元素。 (期间)在他们的ID?

鉴于以下类和控制器的操作方法:

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 }; } 

并且以下forms:

 <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> 

我能够更新学校实例和学校地址成员。 这很好! 谢谢ASP.NET MVC团队!

但是,如何使用jQuery来select下拉列表,以便我可以预填充它? 我意识到我可以做这个服务器端,但是页面上会有其他dynamic元素影响列表。

以下是我到目前为止,并且它不起作用,因为select器似乎不符合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); }); }); }); 

来自Google网上论坛 :

在每个特殊字符之前使用两个反斜杠。

jQueryselect器中的反斜杠转义下一个字符。 但是你需要两个,因为反斜杠也是JavaScriptstring的转义字符。 第一个反斜杠转义第二个,给你一个实际的反斜杠在你的string – 然后转义为jQuery的下一个字符。

所以,我猜你在看

 $(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); }); }); }); 

另外检查一下如何通过在CSS符号中使用字符的ID来select一个元素? 在jQuery常见问题。

如果id包含空格,则不能使用jQuery idselect器。 使用属性select器:

 $('[id=foo bar]').show(); 

如果可能,请指定元素types:

 $('div[id=foo bar]').show(); 

逃脱它的JQuery:

 function escapeSelector(s){ return s.replace( /(:|\.|\[|\])/g, "\\$1" ); } 

用法示例:

 e.find('option[value='+escapeSelector(val)+']') 

更多信息在这里 。

刚刚发布的ASP.NET MVC Release Candleate解决了这个问题,现在用ID属性的下划线代替点。

 <%= Html.TextBox("Person.FirstName") %> 

呈现到

 <input type="text" name="Person.FirstName" id="Person_FirstName" /> 

有关更多信息,请参阅第14页的发行说明。

这在jQuery Selectors文档中有logging :

要使用任何元字符(如!"#$%&'()*+,./:;<=>?@[\]^`{|}~ )作为名称的文字部分,它必须用两个反斜杠转义:例如, id="foo.bar"的元素可以使用select符$("#foo\\.bar")

总之,前缀.\\如下:

 $("#Address\\.Country") 

为什么不呢. 在我的ID工作?

问题是这样的. 有特殊的意义,下面的string被解释为类select器。 所以$('#Address.Country')会匹配<div id="Address" class="Country">

当以\\.转义时\\. ,点将被视为正常的文本,没有特别的意义,匹配你想要的ID <div id="Address.Country">

这适用于所有的字符!"#$%&'()*+,./:;<=>?@[\]^`{|}~在jQuery中,把他们当作正常的文字。

为什么2 \\

正如bdukes所指出的那样,我们需要2个字符是有原因的。 \将在JavaScript中转义下面的字符。 当JavaScript解释string"#Address\.Country" ,它会看到\ ,解释它意味着采取以下字符litterally删除它当string作为parameter passing给$() 。 这意味着jQuery仍然会将该string视为"#Address.Country"

这就是第二个“进场”的地方。 第一个告诉JavaScript将第二个解释为文字(非特殊)字符。 这意味着第二个将被jQuery看到,并理解以下内容. 字符是文字​​字符。

唷! 也许我们可以想象这一点。

 // Javascript, the following \ is not special. // | // | // v $("#Address\\.Country"); // ^ // | // | // jQuery, the following . is not special. 

使用两个反斜杠没关系,这是工作。 但是,如果您使用dynamic名称,我的意思是,一个variables名称,您将需要replace字符。

如果你不想改变你的variables名称,你可以这样做:

 var variable="namewith.andother"; var jqueryObj = $(document.getElementById(variable)); 

比你有jQuery的对象。

只是额外的信息:检查这个ASP.NET MVC问题#2403 。

在问题解决之前,我使用自己的扩展方法(如Html.TextBoxFixed等),它只是用id属性中的下划线replace点(不在name属性中),以便像$(“#Address_Street”)那样使用jquery。但在服务器上,就像Address.Street。

示例代码如下:

 public static string TextBoxFixed(this HtmlHelper html, string name, string value) { return html.TextBox(name, value, GetIdAttributeObject(name)); } public static string TextBoxFixed(this HtmlHelper html, string name, string value, object htmlAttributes) { return html.TextBox(name, value, GetIdAttributeObject(name, htmlAttributes)); } private static IDictionary<string, object> GetIdAttributeObject(string name) { Dictionary<string, object> list = new Dictionary<string, object>(1); list["id"] = name.Replace('.', '_'); return list; } private static IDictionary<string, object> GetIdAttributeObject(string name, object baseObject) { Dictionary<string, object> list = new Dictionary<string, object>(); list.LoadFrom(baseObject); list["id"] = name.Replace('.', '_'); return list; } 

我解决了由jQuery文档给出的解决scheme的问题

我的function:

 //funcion to replace special chars in ID of HTML tag function jq(myid){ //return "#" + myid.replace( /(:|\.|\[|\]|,)/g, "\\$1" ); return myid.replace( /(:|\.|\[|\]|,)/g, "\\$1" ); } 

注:我删除了“#”,因为在我的代码中,我用另一个文本连接ID

字体: Jquery Docsselect具有特殊字符的元素