N個のリストボックスを部分ビューでレンダリングするビューモデルがあります。各リスト ボックスには、 PartIDと呼ばれる一意の ID があります。これらのリストボックスを使用すると、ユーザーはリスト項目を複数選択できます。
私がやろうとしているのは、ajaxリクエストが行われる前に、リストボックスが存在するかどうかを確認し、それぞれのリストボックスで選択されたアイテムのインデックスを保存することです。同じ litsbox が再度レンダリングされる場合は、以前に選択されたアイテムを保持し、ajax リクエストの成功関数を事前に選択します。
これらのリストボックスは AJAX 経由で取得されます
$.ajax({
type: 'POST',
url: serviceListPartsUrl,
cache: false,
datatype: "html",
data: { ServiceEntryID: $("#ServiceEntryID").val(), Parts: partTextArea },
success: function (result) {
$("#inputParts").html(result);
}
});
モデルを見る
using System.Collections.Generic;
using RunLog.Domain.Entities;
namespace RunLog.WebUI.Models
{
public class ServiceEntryListPartsViewModel
{
public IEnumerable<ServiceEntryPartDisplay> Parts { get; set; }
}
}
部分図:
<tr>
<td>@string.Format("{0:MM/dd/yyyy hh:mm:ss tt}", Model.PartDescription)
@Html.HiddenFor(model => model.PartDescription)
</td>
<td>
@Html.ListBoxFor(model => model.ServiceTypes, new MultiSelectList(RunLog.Domain.Lists.GlobalList.PartsServiceTypes(), "ID", "Name"), new { style = "width: 200px; height: 80px;", id = @Model.PartID, name = "listbox" })
</td>
<td>@Html.TextAreaFor(model => model.Comment, new { style = "width: 200px; height: 80px;" })
</td>
</tr>
コントローラ アクション
[HttpPost]
//[OutputCacheAttribute(NoStore=true,Duration=0,VaryByParam="*")]
public ViewResult ListParts(string ServiceEntryID, string Parts)
{
int id = Convert.ToInt32(ServiceEntryID);
ServiceEntryListPartsViewModel viewModel = new ServiceEntryListPartsViewModel();
List<ServiceEntryPartDisplay> parts = new List<ServiceEntryPartDisplay>();
if (Parts.Length > 0)
{
var partsServiceTypeResults = from rec in db.ServiceEntryPart
join ec in db.Part on rec.PartID equals ec.ID
where (rec.ServiceEntryID.Equals(id) && ec.Active == true)
orderby rec.ServiceEntryID
select new ServiceEntryPartDisplay()
{
ServiceEntryID = rec.ServiceEntryID,
PartID = rec.PartID,
PartDescription = ec.PartDescription,
ServiceTypeIDs = rec.ServiceTypeIDs,
Comment = rec.Comment
};
string[] splitData = Parts.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string split in splitData)
{
ServiceEntryPartDisplay part = new ServiceEntryPartDisplay();
part.PartDescription = split;
part.PartID = Convert.ToInt32(split);
part.PartDescription = string.Format("{0} ~ {1}", split, (from pp in db.Part where pp.ID.Equals(part.PartID) select pp.PartDescription).FirstOrDefault());
var results = (from pp in partsServiceTypeResults where pp.PartID.Equals(part.PartID) select new { pp.ServiceTypeIDs, pp.Comment }).FirstOrDefault();
if (results != null)
{
part.Comment = results.Comment;
part.ServiceTypes = Domain.Lists.GlobalList.GetPartsServiceTypes(results.ServiceTypeIDs);
}
else
{
part.Comment = "";
part.ServiceTypes = new List<Domain.Lists.PartsServiceType>();
}
parts.Add(part);
}
}
viewModel.Parts = parts;
return View(viewModel);
}