現在、ASP MVC3 ビューで Ajax 呼び出しを使用して、新しいリスト項目をページに追加しています。ViewResult
ビューは、部分ビューを返すコントローラー アクションを呼び出す Ajax 呼び出しを行います。次に、Ajax は、呼び出し元の要素で.append(html)
メソッドを呼び出すように設定されます。<div>
問題は、新しい行を追加する代わりに、ビュー全体が消えて部分的なものだけが表示されることです。
これがビュー内のコードです。このビューは、別のモデルのリスト オブジェクトを持つビュー モデルを使用します。コードのこの部分は、部分ビューを呼び出して、リスト オブジェクトの各項目を表示します。
@model Monet.ViewModel.BankListViewModel
@using (Html.BeginForm())
{
<fieldset>
<legend>Stat(s) Fixed</legend>
<table>
<th>State Code</th>
<th>Agent ID</th>
<th></th>
<div class="fixedRows">
@foreach(var item in Model.Fixed)
{
if (!String.IsNullOrWhiteSpace(item.AgentId))
{
@Html.Partial("FixedPartialView", item)
}
}
</div>
</table>
<br />
@Html.ActionLink("Add another", "BlankFixedRow", null, new { id = "addFixed"})
</fieldset>
}
これがaddFixed
Ajax呼び出しです
$("#addFixed").click(function () {
$.ajax({
url: this.href,
cache: false,
success: function (html) { $("#fixedRows").append(html); }
});
return false;
});
これはViewResult
、Ajax が呼び出すコントローラー アクションです。
public ViewResult BlankFixedRow()
{
SelectList tmpList = new SelectList(new[] { "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NA", "NM", "NY", "NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "US", "VT", "VI", "VA", "WA", "WV", "WI", "WY" });
ViewBag.StateCodeList = tmpList;
return View("FixedPartialView", new BankListAgentId());
}
最後に、これは部分的なビューです。
@model Monet.Models.BankListAgentId
@using (Html.BeginCollectionItem("Fixed"))
{
<tr id="item-@Model.AgentId">
<td>
@Html.DropDownListFor(model => model.StateCode,
(SelectList)ViewBag.StateCodeList, Model.StateCode)
</td>
<td>
@Html.EditorFor(model => model.AgentId)
@Html.ValidationMessageFor(model => model.AgentId)
</td>
<td>
<a href="#" onclick="$('#item-@Model.AgentId').parent().remove();" style="float:right;">Delete</a></td>
</tr>
}
リンクを選択するAdd another
と、ページは次のようになります
これに
以下のコメントごとに、ページの HTML を次に示します。
<input type="hidden" name="Fixed.index" autocomplete="off" value="6dd1b028-14f7-4400-95d1-a803c2521b68" />
<tr id="item-">
<td>
<select id="Fixed_6dd1b028-14f7-4400-95d1-a803c2521b68__StateCode" name="Fixed[6dd1b028-14f7-4400-95d1-a803c2521b68].StateCode"><option>AL</option>
<option>AK</option>
<option>AS</option>
<option>AZ</option>
.
.
. <-removed list of all 50 states for clarity
</select>
</td>
<td>
<input class="text-box single-line" id="Fixed_6dd1b028-14f7-4400-95d1-a803c2521b68__AgentId" name="Fixed[6dd1b028-14f7-4400-95d1-a803c2521b68].AgentId" type="text" value="" />
</td>
<td>
<a href="#" class="deleteRow">delete</a>
</td>
</tr>
</section>
編集
以下のコメントを読んだ後、テーブルタグを に変更しました<table id="fixedRows">
が、これは同じ結果を返しました。次に、Ajax呼び出しの属性を変更して、success
次のような基本的なHTMLを含めました
success: function (html) { $("#fixedRows").append("<tr><td>New</td></tr>"); }
しかし、再び、同じ結果が得られました。Visual Studio と Chrome のデバッガーの両方でブレークポイントを設定したところ、Ajax が呼び出されていないことがわかりました。代わりに、コントローラー アクションへの呼び出しが行われ、部分ビューが に追加されるのではなく、単独で読み込まれ<table id="fixedRows">
ます。
ただし、誰かにアイデアがあれば、これを回避するためにまだ取り組んでいます。どうも!