c# - 如何在 ASP.NET MVC 3 中为填充的下拉列表创建 View 模型

标签 c# asp.net asp.net-mvc-3

我正在尝试自学 MVC3。我正在从网络表单转换。

我需要创建一个 View 模型,其中包含一个下拉列表,我可以将其传递给 Controller ​​并最终呈现在 View 中。

我怎样才能做到这一点?我有骨架,但我不知道实际为 View 创建名称值对的代码是什么。

namespace DH.ViewModels
{
    public class SharedLayoutViewModel
    {
        public IEnumerable<SelectListItem> Products
        {
            //some code to setup the value/name pairs to be rendered in the view.
            //example: 
            //<option value="1">Mustard</option>
            //<option value="2">Ketchup</option>
            //<option value="3">Mayo</option>
            //<option value="4">Relish</option>
            //<option value="5">BBQ</option>
         }
     }
  }

谢谢

最佳答案

我会为 Product 创建一个类,并在我的 List 类型的主视图模型中创建 Products 属性

public class ProductViewModel
{
  public int ID { set;get;}
  public string Name { set;get;}
}

public class OrderViewModel
{
  public int OrderNumber { set;get;}
  public List<ProductViewModel> Products { set;get;}
  public int SelectedProductId { set;get;}    
}

并在您的 Controller Action 方法中

public ActionResult Order()
{     
   var orderVM=new OrderViewModel();
   //Items hard coded for demo. You may replace with values from your db
   orderVM.Products= new List<ProductViewModel>
    {
        new ProductViewModel{ ID=1, Name="IPhone" },
        new ProductViewModel{ ID=2, Name="MacBook Pro" },
        new ProductViewModel{ ID=3, Name="iPod" }           
    };
   return View(orderVM);
}

在您的 View 中,强类型化为 OrderViewModel。

@model ORderViewModel
@using (Html.BeginForm())
{
  <p> 
    @Html.DropDownListFor(x => x.SelectedProductId ,
                     new SelectList(Model.Products, "ID", "Name"), "-- Select Product--")
  </p>
  <input type="submit" />
}

我还添加了一个 SelectedProductId 属性,因此当用户将表单发回 Controller 时,您将从该属性的下拉列表中获取用户选择的值。

您还可以使用通用 SelectListItem 类型集合作为您的 View 模型属性来传输下拉列表数据,而不是您的自定义 ProductViewModel 集合。

public class OrderViewModel
{
  public int OrderNumber { set;get;}
  public List<SelectListItem> Products { set;get;}
  public int SelectedProductId { set;get;}    
}

在 GET 操作中,

public ActionResult Order()
{     
   var orderVM=new OrderViewModel();
   //Items hard coded for demo. You may replace with values from your db
   orderVM.Products= new List<SelectListItem>
    {
        new SelectListItem {Value = "1", Text = "IPhone"},
        new SelectListItem {Value = "2", Text = "MacBook"},
        new SelectListItem {Value = "3", Text = "Candy"}
    };
   return View(orderVM);
}

在你看来,

@Html.DropDownListFor(x => x.SelectedProductId, Model.Products, "-- Select Product--")

编辑:根据 OP 的要求,编辑答案以使属性将静态项目作为产品返回

我向 Products 属性添加了一个 get 实现以返回静态产品列表。

public class OrderViewModel
{
        private List<ProductViewModel> _products;
        public int OrderNumber { set; get; }
        public List<ProductViewModel> Products
        {
            get
            {
                if (_products == null)
                {
                    _products = new List<ProductViewModel>();
                    _products.Add(new ProductViewModel { ID = 1, Name = "Ketchup" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Mustard" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Relish" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Mayo" });
                }
                return _products;
            }
        }
       public int SelectedProductId { set;get;}
}

现在在您的 Controller 中,您无需调用 GetAvailableProductsm 方法,因为它已经存在。所以 Controller 看起来像这样。

    public ActionResult Order()
    {
        OrderViewModel orderVM = new OrderViewModel();           
        return View(orderVM);
    }

这是输出。 enter image description here

如果您的产品中有很多项目,请将其移至一个方法并调用该方法以获得实现而不是在那里编写。这是一种更简洁的方法。

关于c# - 如何在 ASP.NET MVC 3 中为填充的下拉列表创建 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9882700/

相关文章:

asp.net - 使用终止的 Loadbalancer ssl,如何使用 https 生成链接和其他 url

jquery - CSS 文件中的硬编码 URL

c# - 如何将 MvcHtmlString 呈现为 HTML

c# - 从具有 Distinct/GroupBy 的 IEnumerable 中选择并排序——可能吗?

c# - 有什么方法可以配置 rebus DueMessageSender 频率吗?

c# - 与 MahAppsMetro ProgressIndicator 绑定(bind)失败

c# - 从服务器托管应用程序时如何获取用户文件的本地桌面路径?

c# - 单个 View 上的多个 WebGrid 更新任何操作上的所有 WebGrid

asp.net-mvc-3 - 你如何在 Rackspace 云站点中使用 [RequireHttps]

c# - 无法清除 Winforms-ListBox