2

次のようなカスタム ビュー モデルがあります。

namespace MyCustomNamespace.Models
{
    public class CustomViewModel
    {
        public CustomViewModel()
        {
            FirstViewModel = new FirstModel ();
            SecondViewModel = new SecondModel ();
        }

        public FirstModel FirstViewModel { get; set; }
        public SecondModel SecondViewModel { get; set; }
    }
}

namespace MyCustomNamespace.Models
{
   public class FirstModel 
   {
      public string id { get; set; }
      public string text { get; set; }

      public IEnumerable<SelectListItem> Items
      {
         (...)
      }

       (...)
   }
}

SecondModel は FirstModel に似ています。

私の見解では、かみそりを使用しています:

@model MyCustomNamespace.Models.CustomViewModel

(...)

@Html.DropDownListFor(m => m.FirstViewModel.Id, Model.FirstViewModel.Items)

(...)

ドロップダウン リストにモデルを入力します。

上記のドロップダウンリストで現在選択されている要素がどれかを知りたいのですが、方法がわかりません....多分モデルを通してですか?しかし、どのように?

更新: これは私の実際のモデル タイプです。上記は、私が行っていたことの例です。この場合、FirstModel は ComponentTypeModel になります。

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System;
using Resources;

namespace MyCustomNamespace.Models
{
    public class ComponentTypeModel
    {
        private readonly List<ComponentType> componentTypes;

        public ComponentTypeModel()
        {
            using (ConfigContext dbContext = new ConfigContext())
            {
                try
                {
                    componentTypes = dbContext.ComponentTypes.ToList();
                }
                catch (Exception ex)
                {
                    //EventLogger.LogException(ex);                    
                }
            }
        }

        [Display(Name = "Component Type")]
        public int SelectedCompTypeId { get; set; }

        public IEnumerable<SelectListItem> CompTypeItems
        {
            get
            {
                var allCompTypes = componentTypes.Select(f => new SelectListItem
                {
                    Value = f.ComponentTypeId.ToString(),
                    Text = f.Name
                });

                return DefaultCompTypeItem.Concat(allCompTypes);
            }
        }

        public IEnumerable<SelectListItem> DefaultCompTypeItem
        {
            get
            {
                return Enumerable.Repeat(new SelectListItem
                                               {
                                                   Value = "-1",
                                                   Text = "Select a component type"
                                               }, 
                                         count: 1);
            }

        }
    }
}
4

6 に答える 6

3

あなたのモデルでは、あなたは使用しています

public IEnumerable<SelectListItem> Items
      {
         (...)
      }

それは問題ありませんが、そうすると、選択した項目を手動で設定する必要があります。SelectListSelectListItems のリストの代わりに aを使用することをお勧めします。

したがって、ViewModel には次のものが必要です。

public SelectList Items {get; set;}

あなたのコントローラーでは、それを入力しますSelectList

var myItems = GetMyCollectionOfItems(); //The list to display in the DropDownList
model.FirstViewModel.Items = new SelectList(myItems, "NameOfValueField", "NameOfTextField", selectedValue); //The selected value is optional

次に、ビューで次を使用します。

@Html.DropDownListFor(m => m.FirstViewModel.Id, Model.FirstViewModel.Items, "--- Select Item---", new { @id = "firstModelID" })

使用したコードと同じであることを確認しますが、この方法では、どの項目が選択されているかを知っている SelectList であり、手動で何もする必要はありません。SelectList コンストラクターで選択項目の ID をロードするだけです。

次に、クライアント側でどの項目が選択されているかを知る必要がある場合は、それを Javascript で使用して何かまたはそのようなものを非表示にするために、他の人の回答を実行できます。

$( document ).ready(function() {
   var mySelectedValue = $('#firstModelID').val();
   alert(mySelectedValue);  
});

選択値がいつ変更されるかを知る必要がある場合:

$( document ).ready(function() {
   $('#firstModelID').change(function() {
       alert($('#firstModelID').val());
   });
});

更新後:

モデルにあるすべてのコードは、この回答のコードを使用して大幅に簡素化できます。

少し変更する必要があります。

[Display(Name = "Component Type")]
        public int SelectedCompTypeId { get; set; }

[Display(Name = "Component Type")]
        public int? SelectedCompTypeId { get; set; }  //Now this is nullable

このようにすれば、デフォルトのアイテムを追加する必要はありません...次を使用するだけです:

@Html.DropDownListFor(m => m.FirstViewModel.Id, Model.FirstViewModel.Items, "Select a component type", new { @id = "firstModelID" })

次に、コントローラーで、「-1」を受け取ったときに行うことと同等のことを行うのが Null であることを確認できます。

これで、すべてのデータベース アクセスがモデルから離れているはずです。モデルは次の方法でよりきれいになります。

public class ComponentTypeModel
    {
        [Display(Name = "Component Type")]
        public int? SelectedCompTypeId { get; set; }
        public SelectLis CompTypeItems { get; set:}

    }

次に、コントローラーで次のことを行います。

var model = new ComponentTypeModel();
model.CompTypeItems = new SelectList(dbContext.ComponentTypes.Select(x => x.Name, x.ComponentTypeId), "ComponentTypeId", "Name");

それらのいずれかをデフォルトで選択したい場合 (編集ビューで通常行うように)、次のようにします。

var model = new ComponentTypeModel();
model.CompTypeItems = new SelectList(dbContext.ComponentTypes.Select(x => x.Name, x.ComponentTypeId), "ComponentTypeId", "Name", myDefaultValue);  //where the myDefaultValue is an int

選択したアイテム、アイテムのコレクション、マップされるフィールドに関するすべての情報がコントローラーとモデルに残るため、ビューのレーザー コードは同じままである必要があります。

于 2013-10-02T11:39:38.293 に答える
2

フォームを送信する前にそれを知りたい場合 (クライアント側)

 @Html.DropDownListFor(m => m.FirstViewModel.Id, Model.FirstViewModel.Items, "--- Select Item---", new { @id = "firstModelID" })

次の方法でその値を確認できます。$('#firstModelID').val();

于 2013-10-02T11:09:29.533 に答える
2

クライアント側の C# でそれを識別する方法はありません。そのためには、次のような jQuery/JavaScript を使用する必要があります。

$("#FirstViewModel_Id").val();
于 2013-10-02T11:12:57.607 に答える
2
var Id = $("#FirstViewModel_Id").val();

alert(Id);
于 2013-10-02T11:14:08.003 に答える
1

選択した値は、サーバーへの投稿後に、Id投稿されたモデル ( FirstViewModel) のプロパティになります。

にアクセスできます。

クライアントで選択した値を取得する場合は、次を使用できます。

$("#FirstViewModel_Id").val();

また

$("#FirstViewModel_Id option:selected").val();

最初のものが機能しない場合。

于 2013-10-02T11:23:08.607 に答える
1

ここでの回答に加えて、次のようにすることもできます。

$("#FirstViewModel_Id option:selected").val();
于 2013-10-02T11:24:20.080 に答える