asp.net mvc 下拉列表

第一步:新建一个格式化下拉列表的公共类文件

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace GmkGM.Infrastructure
{
    public class Common
    {
        /// <summary>
        /// 获取下拉列表(有层级结构)
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        public static IList<SelectListItem> GetDropdownList(IList listInfo,int? Id,string name)
        {
            DataTable ds = Common.ToDataSet(listInfo).Tables[0];

            if (null != ds && ds.Rows.Count > 0)
            {
                //添加一列
                ds.Columns.Add("Level", typeof(int));
                // 克隆dt 的结构,包括所有 dt 架构和约束,并无数据
                DataTable newDT = ds.Clone();
                DataTable catelist = Common.GetTreeList(ds, newDT, 0, 0);
                if (catelist.Rows.Count > 0)
                {
                    IList<SelectListItem> list = new List<SelectListItem>();
                    foreach (DataRow row in catelist.Rows)
                    {
                        SelectListItem item = new SelectListItem();
                        item.Value = Convert.ToString(row["ID"]);
                        string pri = "----";
                        var rt = row["Level"];
                        item.Text = row[name] == DBNull.Value ? string.Empty : Common.StringRepeat(pri, Convert.ToInt32(row["Level"]) + 1) + Convert.ToString(row[name]);

                        if (Id == Convert.ToInt32(item.Value))
                        {
                            item.Selected = true;
                        }

                        list.Add(item);
                    }
                    SelectListItem first = new SelectListItem();
                    first.Text = "--父类--";
                    first.Value = "0";
                    list.Insert(0, first);
                    return list;
                }
            }
            return null;
        }        //无层级结构
        public static IList<SelectListItem> GetDropdownList2(IList listInfo, int? Id, string name)
        {
            if (listInfo.Count > 0)
            {
                DataTable ds = Common.ToDataSet(listInfo).Tables[0];

                if (null != ds && ds.Rows.Count > 0)
                {
                    IList<SelectListItem> list = new List<SelectListItem>();
                    foreach (DataRow row in ds.Rows)
                    {
                        SelectListItem item = new SelectListItem();
                        item.Value = Convert.ToString(row["ID"]);
                        item.Text = row[name] == DBNull.Value ? string.Empty : Convert.ToString(row[name]);

                        if (Id == Convert.ToInt32(item.Value))
                        {
                            item.Selected = true;
                        }

                        list.Add(item);
                    }
                    SelectListItem first = new SelectListItem();
                    first.Text = "--父类--";
                    first.Value = "0";
                    list.Insert(0, first);
                    return list;
                }
                return null;
            }
            return null;
        }
        /// <summary>
        /// 生成树形结构
        /// </summary>
        /// <param name="dt">数据源表</param>
        /// <param name="newDT">返回的结果表</param>
        /// <param name="Pid">父类ID值</param>
        /// <param name="level">层级</param>
        /// <returns></returns>
        public static DataTable GetTreeList(DataTable dt, DataTable newDT, int Pid, int level = 0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (Convert.ToInt32(dt.Rows[i]["Pid"]) == Pid)
                {
                    //用来标记这个分类是第几级的
                    dt.Rows[i]["Level"] = level;
                    newDT.Rows.Add(dt.Rows[i].ItemArray);
                    //找子分类
                    DataTable innerDT = GetTreeList(dt, newDT, Convert.ToInt32(dt.Rows[i]["Id"]), level + 1);
                }
            }
            return newDT;
        }

        /// <param name="str">字符串</param>
        /// <param name="n">重复次数</param>
        public static string StringRepeat(string str, int n)
        {
            if (String.IsNullOrEmpty(str) || n <= 0)
                return str;
            StringBuilder sb = new StringBuilder();
            while (n > 0)
            {
                sb.Append(str);
                n--;
            }
            return sb.ToString();
        }
        // list转换为DataSet
        public static DataSet ToDataSet(IList p_List)
        {
            DataSet result = new DataSet();
            DataTable _DataTable = new DataTable();
            if (p_List.Count > 0)
            {
                PropertyInfo[] propertys = p_List[0].GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    _DataTable.Columns.Add(pi.Name, pi.PropertyType);
                }

                for (int i = 0; i < p_List.Count; i++)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo pi in propertys)
                    {
                        object obj = pi.GetValue(p_List[i], null);
                        tempList.Add(obj);
                    }
                    object[] array = tempList.ToArray();
                    _DataTable.LoadDataRow(array, true);
                }
            }
            result.Tables.Add(_DataTable);
            return result;
        }
        /// <summary>
        /// 找出一个分类所有子分类的ID
        /// </summary>
        /// <param name="catId"></param>
        ///
        /// <returns></returns>
        public static DataTable GetChildren(DataTable dt, int catId)
        {
            //定义一个表存放保存找到的子分类的id
            DataTable newDT = new DataTable();
            //添加一列
            newDT.Columns.Add("CID", typeof(int));
            if (dt != null && dt.Rows.Count > 0)
            {
                //循环所有的分类找子类
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (Convert.ToInt32(dt.Rows[i]["PID"]) == catId)
                    {
                        newDT.Rows.Add((Object)dt.Rows[i]["Id"]);
                        //再找这个$v的子分类
                        GetChildren(dt, Convert.ToInt32(dt.Rows[i]["Id"]));
                    }
                }
            }
            return newDT;
        }
    }
}

第二步:服务层调用

        public IList List2()
        {
            return db.Whse_Stock_List().ToList();
        }

        public IList<SelectListItem> GetProductDropdownList(int? Id)
        {
            return Common.GetDropdownList2(List2(), Id, "ProductName");
        }

        public IList List()
        {
            return db.Whse_Location_List().ToList();
        }

        public IList<SelectListItem> GetLocationDropdownList(int? Id)
        {
            return Common.GetDropdownList(List(), Id,"Code");
        }

第三步:控制器调用

        // GET: Inventory/Create
        public ActionResult Create()
        {
            #region 产品下拉列表
            ViewBag.ProductTypes = new InventoryService().GetProductDropdownList(null);
            #endregion

            #region 仓库位置下拉列表
            ViewBag.LocationTypes = new InventoryService().GetLocationDropdownList(null);
            #endregion

            return View();
        }
        [ValidateAntiForgeryToken]
        [HttpPost]
        public ActionResult Create(Inventory model)
        {
            try
            {
                #region 产品下拉列表
                ViewBag.ProductTypes = new InventoryService().GetProductDropdownList(model.StockID);
                #endregion

                #region 仓库位置下拉列表
                ViewBag.LocationTypes = new InventoryService().GetLocationDropdownList(model.LocationID);
                #endregion

                //验证模型是否有效
                if (ModelState.IsValid)
                {
                    bool res = new InventoryService().Insert(model);
                    if (!res)
                    {
                        TempData[LastMessageInfoKey.LastErrorMessageTempDataKey] = "创建失败!";
                        return View(model);
                    }
                    TempData[LastMessageInfoKey.LastSuccessMessageTempDataKey] = "创建成功!";
                    return RedirectToAction("Index");
                }
                else
                {
                    return View(model);
                }
            }
            catch (Exception ex)
            {
                TempData[LastMessageInfoKey.LastErrorMessageTempDataKey] = ex.Message;
                return View(model);
            }
        }
        // GET: Inventory/Edit/5
        public ActionResult Edit(int StockID, int LocationID)
        {
            InventoryModel Inventory = service.Get(StockID,LocationID);

            #region 产品下拉列表
            ViewBag.ProductTypes = new InventoryService().GetProductDropdownList(StockID);
            #endregion

            #region 仓库位置下拉列表
            ViewBag.LocationTypes = new InventoryService().GetLocationDropdownList(LocationID);
            #endregion

            return View(Inventory);
        }

        [ValidateAntiForgeryToken]
        [HttpPost]
        public ActionResult Edit(Inventory model)
        {
            try
            {
                #region 产品下拉列表
                ViewBag.ProductTypes = new InventoryService().GetProductDropdownList(model.StockID);
                #endregion

                #region 仓库位置下拉列表
                ViewBag.LocationTypes = new InventoryService().GetLocationDropdownList(model.LocationID);
                #endregion

                //验证模型是否有效
                if (ModelState.IsValid)
                {
                    bool res = service.Update(model);
                    if (!res)
                    {
                        TempData[LastMessageInfoKey.LastErrorMessageTempDataKey] = "编辑失败!";
                        return View(model);
                    }
                    TempData[LastMessageInfoKey.LastSuccessMessageTempDataKey] = "编辑成功!";
                    return RedirectToAction("Index");
                }
                else
                {
                    return View(model);
                }
            }
            catch (Exception ex)
            {
                TempData[LastMessageInfoKey.LastErrorMessageTempDataKey] = ex.Message;
                return View(model);
            }
        }

第四步:前端页面调用

@model GmkGM.Whse.Model.Inventory
@{
    ViewBag.Title = "Create";
}

@section styles{
    @Styles.Render("~/bundles/form/css")
}

@section scripts{
    @Scripts.Render("~/bundles/form/js")
}

@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()

    <div class="row">
        <div class="col-xs-12">
            <fieldset>
                @Html.LabelFor(model => model.StockID)(必填)
                @if (ViewBag.ProductTypes != null)
                {
                    @Html.DropDownList("StockID", ViewBag.ProductTypes as IEnumerable<SelectListItem>, new { @class = "form-control" })
                }
                else
                {
                    <select id="StockID" name="StockID" class="form-control"></select>
                }
            </fieldset>
            <fieldset>
                @Html.LabelFor(model => model.LocationID)(必填)
                @if (ViewBag.LocationTypes != null)
                {
                    @Html.DropDownList("LocationID", ViewBag.LocationTypes as IEnumerable<SelectListItem>, new { @class = "form-control" })
                }
                else
                {
                    <select id="LocationID" name="LocationID" class="form-control"></select>
                }
            </fieldset>

            <fieldset>
                @Html.LabelFor(model => model.Balance)(必填)
                @Html.EditorFor(model => model.Balance, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Balance, "", new { @Style = "color:red" })
            </fieldset>
        </div>
    </div>
    <div class="form-actions center">
        <button class="btn btn-sm btn-success" type="submit">
            提交
            <i class="ace-icon fa fa-arrow-right icon-on-right bigger-110"></i>
        </button>

        <a class="btn btn-sm btn-warning" href="@Url.Action("Index")">
            返回
            <i class="ace-icon fa fa-undo bigger-110"></i>
        </a>
    </div>
}

时间: 2024-07-31 12:42:08

asp.net mvc 下拉列表的相关文章

ASP.NET MVC5(一):ASP.NET MVC概览

ASP.NET MVC概览 ASP.NET MVC是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. ASP.NET MVC模式简介 MVC将Web应用程序划分为三个主要的部分,以下是MSDN给出的定义: 模型(Model):模型对象是实现应用程序数据域逻辑的应用程序部件. 通常,模型对象会检索模型状态并将其存储在数据库中. 例如,Product 对象可能会从数据库中检索信息,操作该信息,然后将更新的信息写回到 SQL S

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity Framework的背景信息,然后再详细学习如何搭建开发环境. 1.1 MVC和ASP.NET MVC 这本书涵盖Microsoft版本的MVC,即ASP.NET MVC.在写本书的时候,ASP.NET MVC的生产版本为MVC5,因此,本书的示例代码都使用ASP.NET MVC 5编写.在本书中

[Asp.net MVC]Asp.net MVC5系列——添加数据

目录 概述 显示添加数据时所用表单 处理HTTP-POST 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据 概述 上篇文章介绍了如何通过控制器访问模型中的数据,在本节中我们将要在数据库中追加并保存一些数据.我们将要创建一个表单以及一些表单输入

ASP.NET MVC Overview

ASP.NET MVC Overview The Model-View-Controller (MVC) architectural pattern separates an application into three main components: the model, the view, and the controller. The ASP.NET MVC framework provides an alternative to the ASP.NET Web Forms patter

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用高级功能

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十二篇:为ASP.NET MVC应用程序使用高级功能 原文:Advanced Entity Framework 6 Scenarios for an MVC 5 Web Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中,您已经实现了继承.本教程引入了当你在使用实体框架Code

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序更新相关数据 原文: Updating Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经成功显示了相关数据.在本教程中

ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

原文:ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view) 在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.

ASP.NET MVC 替换默认的基架模板

在学习Asp.net Mvc中,今天第一次听了基架,哈哈! 常用的首字母缩略词 CRUD 恰当地传达了根据数据存储编写例程创建.检索.更新和删除操作的普通任务.Microsoft 提供由 T4 模板强力驱动的实用基架引擎,可为使用实体框架的 ASP.NET MVC 应用程序中的模型自动创建基本的 CRUD 控制器和视图(目前也可使用不带实体框架基架的 WebAPI 和 MVC). 基架生成可导航和使用的页面.总而言之,它们减少了您在构建 CRUD 页面时需要执行的单调工作.不过,基架生成的结果提

(转)表单和HTML辅助方法 - ASP.NET MVC 3

——选自<ASP.NET MVC3 高级编程(第5章)  孙远帅 译> ——微软ASP.NET MVC系列书籍地址: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-3.productCd-1118076583.html 第5章 表单和HTML辅助方法  本章内容简介: * 理解表单 * 如何利用HTML辅助方法 * 编辑和输入的辅助方法 * 显示和渲染的辅助方法 顾名思义,HTML辅助方法是用来辅助HTML开发的