[对不起,问题很长,但有必要解释问题]
我正在一个学习网站上工作,如果有的话,它应该向用户显示一个消息列表。像这样的东西:
当用户按下关闭按钮时,该消息必须标记为“已读”,下次不应显示。以下代码用于生成这些消息:
<% foreach (var m in Model.UserMessages) { %>
<div class="um" id="m<%=Html.AttributeEncode(m.ID) %>">
<p class="mh"><%= Html.Encode (String.Format ("From {0} ({1})", m.From, m.Sent)) %></p>
<p><%= Html.Encode (m.Text) %></p>
<% using (Html.BeginForm ("CloseMessage", "Home", new { id = m.ID })) { %>
<input type="submit" value="Close<%= Html.AttributeEncode (m.ID) %>" id="c<%= Html.AttributeEncode (m.ID) %>"/>
<% } %>
</div>
<% } %>
之后,按照指南,我在控制器中添加了对 http post 方法的支持,它将消息标记为已读,然后刷新视图(以处理禁用的 JavaScript):
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CloseMessage (int id) {
using (var dl = new DL ()) {
dl.MarkAsRead (id);
}
if (Request.IsAjaxRequest ()) {
return new EmptyResult ();
}
else {
return RedirectToAction ("Index");
}
}
然后我想添加 JavaScript 支持,以便只有消息消失(使用 jQuery)。但问题是我正在以编程方式生成按钮和消息。
所以最终在视图页面中出现了一个看起来很奇怪的 javascript 代码:
<script type="text/javascript">
$().ready(function() {
<% foreach (var m in Model.UserMessages) { %>
$("#c<%=Html.AttributeEncode (m.ID) %>").click(function(event) {
$.post("Home/CloseMessage/<%=Html.AttributeEncode (m.ID) %>");
$("#m<%=Html.AttributeEncode (m.ID) %>").slideUp("slow");
event.preventDefault();
});
<% } %>
});
</script>
这基本上是在 C# 循环中创建 javascript 代码,它实际上可以工作,但我无法消化。有没有更好的方法来做到这一点?