刚进入JQuery和Asp.net MVC 2,想知道如何将变量从循环传递到javascript函数。
所以我有:
<% int i = 0; %>
<% foreach (var item in Model) { %>
<tr>
<td>
<input type="button" id="btnSubmit" value="Save" onclick="javascript:updatePerson(i);" />
<input type="text" id='<%= "persons[" + i + "].Name" %>' name='<%= "persons[" + i + "].Name" %>' value='<%=item.Name %>' />
</td>
</tr>
<% i++; %>
<% } %>
显然
onclick="javascript:updatePerson(i);"
错了。
如何将变量i传递给updatePerson函数?
JD
答案 0 :(得分:2)
我建议你采取一种不同的,更好的方法,因为我现在看到你将C#,javascript和HTML混合到同一页面中,这导致了所谓的可怕标签汤。
改进1:使用编辑器模板而不是那些foreach循环。在您的主视图中,而不是简单地写下您在问题中发布的内容:
<%= Html.EditorForModel() %>
然后定义一个编辑器模板,该模板将自动为模型集合中的每个元素调用(~/Views/Home/EditorTemplates/Person.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<YourApp.Models.Person>" %>
<tr>
<td>
<% using (Html.BeginForm("Save", "Persons",
new { id = Model.Id }, FormMethod.Post,
new { @class = "saveform" })) { %>
<%= Html.TextBoxFor(x => x.Name) %>
<input type="submit" value="Save" />
<% } %>
</td>
</tr>
请注意,partial的名称与强类型的类型名称相同(Person.ascx
)。另请注意位置:~/Views/Home/EditorTemplates
其中Home
当然是当前控制器的名称。如果您想在多个控制器之间重用它,它也可以放在~/Views/Shared/EditorTemplates
中。并且因为编辑器模板是强类型的视图模型,您可以使用强类型帮助程序,如Html.TextBoxFor
,这样您就不必手动硬编码文本框的名称和值,并想知道为什么模型绑定器没有'工作正常。
改进2:在单独的javascript文件中使用jquery逐步增强标记:
$(function() {
$('.saveform').submit(function() {
// When the form is submitted
// For example you could call the associated action using AJAX:
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function(result) {
alert('successfully saved');
}
});
return false;
});
});
答案 1 :(得分:1)
您可以在Javascript表达式中嵌入i
的当前值,就像在其余代码中执行此操作一样:
<input type="button" id="btnSubmit" value="Save"
onclick="updatePerson(<%= i %>);" />
答案 2 :(得分:1)
onclick="javascript:updatePerson(<%=i%>);"
应该工作
答案 3 :(得分:0)
Javascript是客户端,而asp是服务器端。换句话说:
这就是原始代码不起作用的原因。生成的html中不存在i
。