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
      {
         (...)
      }

这很好,但是这样做,您需要手动设置所选项目。我建议您使用 aSelectList而不是 SelectListItems 列表。

因此,在您的 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" })

然后在您的控制器中,您可以看到它是 Null,您执行与收到“-1”时所做的等效的操作。

现在,所有的数据库访问都应该远离模型。这样模型就干净多了:

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 回答