[長い質問で申し訳ありませんが、問題を説明する必要があります]
私は学習 Web サイトに取り組んでおり、メッセージがある場合はユーザーにメッセージのリストを表示することになっています。このようなもの:
ユーザーが閉じるボタンを押すと、そのメッセージは「既読」とマークされ、次回は表示されないようにする必要があります。これらのメッセージを生成するには、次のコードを使用します。
<% 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 コードを作成していますが、消化するには多すぎます。これを行うより良い方法はありますか?