[Извините за длинный вопрос, но необходимо объяснить проблему]
Я работаю над учебным веб-сайтом, и он должен показывать пользователю список сообщений, если они есть. Примерно так:
Когда пользователь нажимает кнопку закрытия, это сообщение должно быть помечено как «прочитанное» и не должно отображаться в следующий раз. Следующий код используется для генерации этих сообщений:
<% 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>
Это в основном создание кода javascript в цикле C #, который на самом деле работает, но слишком много для меня, чтобы переварить. Есть ли лучший способ сделать это?