我如何让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具有特殊字符的元素