0

現在、選択したアイテム ID を確認し、以前に選択したアイテムを表示する編集ページのドロップダウン リストに表示しようとしています。アイテムは、アクティブなステータスに基づいて表示されます。すべてのアクティブな項目がドロップダウンに表示され、ユーザーの以前の選択項目が現在非アクティブである場合でも、以前に選択されていたため、ドロップダウン リストのその項目にデフォルト設定する必要があります。私の問題は、編集ページでユーザーが選択した非アクティブなアイテムを表示できないことです。すべてのコードを投稿します。これは、別のリンクで尋ねられた質問の続きです: null パラメータを渡す

コントローラーの私のコード:

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null)
{
    if(viewModel == null)
      viewModel = new AppointmentViewModel();
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll().OrderBy(
        c => c.Sort == null).ThenBy(
            c => c.Sort).ThenBy(c => c.Description);

    if(items.Count()==0)
        ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural));
   return
        _itemDescriptionRepository.FindAll().OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
            c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()});
}

コントローラーでの私の編集方法:

[HttpGet]
    [AppointmentAuthorization]
    public ActionResult Edit(Guid appointmentId)
    {
        Appointment appointment = _appointmentService.Get(appointmentId);
        if (appointment == null) return View("NotFound");


        var viewModel = new AppointmentViewModel
                            {
                                AppointmentId = appointment.AppointmentId,

                            };
        viewModel.Items= GetItems();

        return this.RazorView("Edit", viewModel);
    }

何かが欠けているようで、viewModel.Items= GetItems() のパラメーターとして viewModel を渡してもあまり効果がありませんでした。Edit 用の別の Post メソッドと、GetItems() メソッドを呼び出す Create メソッドもあります。どんな助けでも素晴らしいでしょう。ありがとう

これは、ViewModel クラスにあるものです。

public IEnumberable<SearchItems> Items {get; set;}
public Guid ItemDescriptionid {get; set;}

作成方法:

[HttpGet]
    [AppointmentAuthorization]
    public ActionResult Create(Guid caseId)
    {
        var viewModel = new AppointmentViewModel
                            {
                               Items= GetItems()
                            };

        return this.RazorView("Create", viewModel);
    }

*****解決*****

private IEnumerable<SearchItems> GetItems(Appointment appointment)
    {
        IEnumerable<short?> itemDescriptionIds =
            appointment.AppointmentItems.Where(c => c.ItemDescriptionId.HasValue).Select(
                c => c.ItemDescriptionId).Distinct();

        IOrderedQueryable<ItemDescription> itemDescription =
            _itemDescriptionRepository.FindAll().Where(
                a => a.IsActive == true || itemDescriptionIds.Contains(a.ItemDescriptionId)).OrderBy(
                    d => d.Description);

        return itemDescription.Select(c=> new SearchItems{Text = c.Description, Value = c.ItemDescriptionId.ToString()});
    }
4

1 に答える 1

0

最初のコードが以前に選択された値をクエリしなかった理由は、クエリがa.ItemDescriptionId == viewModel.ItemDescriptionIdアイテムの説明IDを比較するためですが、ビューモデルでは予定IDのみを設定します。アイテムの説明IDが必要な場合は、必ず初期化してください。

var viewModel = new AppointmentViewModel
{
     AppointmentId = appointment.AppointmentId,
     ItemDescriptionId = appointment.ItemDescriptionId
};

推奨されるリファクタリング:

private IEnumerable<SearchItems> GetItems(Guid lastId = new Guid())
{
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll();

    if(!items.Any())
        ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural));

    return items
        .OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == lastId)
        .Select(c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()});
}

ViewModelを使用するすべての人が必要なGUIDを取得しているときに、ViewModelを渡すのはばかげています。それからそれを次のように呼びます

viewModel.Items= GetItems(appointment.ItemDescriptionId);

それでもクエリが正しいアイテムを追加しない場合は、次のようにデバッグしてみてください。

var testExists = itemDescriptionRepository.FindAll().FirstOrDefault(a.ItemDescriptionId == lastId);

それが見つからず、lastIdが正しく設定されていることが確実な場合は、データベースの問題である可能性があります。

于 2012-04-26T20:02:41.703 に答える