0

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);
            }
4

1 に答える 1

0

私はあなたがそれをしている方法を単純化することができると思います。ViewModelたとえば、ServiceTypeID現在選択されているパーツを含むカスタムのコレクションをコントローラーに渡してみませんかIDこれにより、すでに選択されている正しいアイテムを使用して部分ビューを適切に生成できます。このトリックはjavascriptクライアントサイドで実行できますが、お持ちのツールを活用してください。必要なすべてのデータをサーバーにポストバックし、MVCにビューを正しい状態に設定するための処理を任せます。

于 2013-02-07T20:09:50.600 に答える