C# MVC应用程序中基本脚手架积垢上的级联下拉列表 一些背景:

C# MVC应用程序中基本脚手架积垢上的级联下拉列表 一些背景:,c#,ajax,asp.net-mvc,entity-framework,cascadingdropdown,C#,Ajax,Asp.net Mvc,Entity Framework,Cascadingdropdown,您好,我是一名初级程序员,几周前才通过教程学习了ASP.net MVC,我成功地根据我的模型搭建了控制器和视图,实体通过外键与其他实体建立了关系,所以不算太远。到目前为止,我严重依赖Visual Studio 2017提供给我的自动过程,例如我的创建表单自动生成一个由另一个表中的数据填充的Dropdownlist 问题是: 然而,我现在正在努力根据我从另一个dropdownlist中选择的内容过滤这个dropdownlist,我了解到我正在寻找的解决方案是围绕级联Dropdownlists展开的

您好,我是一名初级程序员,几周前才通过教程学习了ASP.net MVC,我成功地根据我的模型搭建了控制器和视图,实体通过外键与其他实体建立了关系,所以不算太远。到目前为止,我严重依赖Visual Studio 2017提供给我的自动过程,例如我的创建表单自动生成一个由另一个表中的数据填充的Dropdownlist

问题是: 然而,我现在正在努力根据我从另一个dropdownlist中选择的内容过滤这个dropdownlist,我了解到我正在寻找的解决方案是围绕级联Dropdownlists展开的。我的情况很像通常的Country State示例,其中State dropdownlist由我从Country dropdownlist中选择的内容填充。我已经接受了必须使用另一种语言(如jquery/ajax)来实现这一点,但我使用的所有解决方案要么看起来与我正在做的太不一样,要么对我来说太高级。我非常努力地学习这一点,但我担心我最终会失败,因为我只使用内置的脚手架来设置我的路线、连接和数据库。我已经在寻找与我背景相同的解决方案,但似乎找不到一个

应用程序 复制我的代码并不难,因为正如我所说,我只是按照基本的说明来制作MVC应用程序,而且几乎所有的代码都是搭建起来的。因此,一般设置如下:

模型 区域实体(如国家)

控制器 我为这些实体提供的控制器基本上是脚手架从一开始就提供给您的,除了在我开始实施我搜索的级联下拉列表解决方案时InstitutionsController中的一些更改(请参见Create、GetRegionList和GetProvinceList方法)

机构控制员

使用System.Collections.Generic;
使用系统数据;
使用System.Data.Entity;
使用System.Linq;
Net系统;
使用System.Web.Mvc;
使用SMOSystemv2.模型;
命名空间SMOSystemv2.Controllers
{
公共类机构控制员:控制员
{
私有SMOSystemv2Context db=新的SMOSystemv2Context();
//获取:机构
公共行动结果索引()
{
var institutions=db.institutions.Include(i=>i.Province);
返回视图(institutions.ToList());
}
//获取:机构/创建
公共操作结果创建()
{
ViewBag.RegionList=新建选择列表(GetRegionList(),“ID”,“RegionName”);
返回视图();
}
公共列表GetRegionList()
{
List regions=db.regions.ToList();
返回区;
}
公共操作结果GetProvinceList(int RegionID)
{
List provinceList=db.Provinces.Where(x=>x.RegionID==RegionID.ToList();
ViewBag.ProvinceOptions=新建选择列表(provinceList、“ProvinceID”、“ProvinceName”);
返回部分视图(“ProvinceOptionPartial”);
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
}
}
意见 和以前一样,除了添加一个区域下拉列表、一个局部视图和一个脚本(我从youtube视频中观看了该脚本,如下所示),我并没有对脚手架做太多更改

机构/创建

@model SMOSystemv2.Models.Institution
@{
ViewBag.Title=“创建”;
}
添加
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
机构

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @LabelFor(model=>model.Province.RegionID,“RegionID”,htmlAttributes:new{@class=“controllabel col-md-2”}) @如果(ViewBag.RegionList!=null) { @Html.DropDownListFor(m=>m.Province.RegionID,ViewBag.RegionList作为SelectList,“--Select Region--”,new{@class=“form control”,@id=“RegionDDL”}) } @Html.ValidationMessageFor(model=>model.Province.RegionID,“,new{@class=“text danger”}) @LabelFor(model=>model.ProvinceID,“ProvinceID”,htmlAttributes:new{@class=“controllabel col-md-2”}) @DropDownListFor(m=>m.ProvinceID,新选择列表(“”,“--Select-Province--”,新{@class=“form-control”}) @Html.ValidationMessageFor(model=>model.ProvinceID,“,new{@class=“text danger”}) @LabelFor(model=>model.InstitutionName,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.InstitutionName,new{htmlAttributes=new{@class=“form control”}}) @Html.ValidationMessageFor(model=>model.InstitutionName,“,new{@class=“text danger”}) } @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) $(文档).ready(函数(){ $(“#RegionDDL”)。更改(函数(){ var regionID=$(this.val(); 调试器 $.ajax({ 类型:“POST”, url:“/Institutions/Create/GetProvinceList?RegionID=“+RegionID, contentType:“html”, 成功:功能(响应){ 调试器 $(“#ProvinceID”).empty(); $(“#省ID”)
using System.Collections.Generic;

namespace SMOSystemv2.Models
{
    public class Region
    {
        public int ID { get; set; }
        public string RegionName { get; set; }
        public virtual ICollection<Province> Provinces { get; set; }
    }
}
using System.Collections.Generic;

namespace SMOSystemv2.Models
{

    public class Province
    {
        public int ID { get; set; }

        public int RegionID { get; set; }

        public virtual Region Region { get; set; }

        public string ProvinceName { get; set; }

        public virtual ICollection<Institution> Institutions { get; set; }
     }
}
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace SMOSystemv2.Models
{

    public class Institution
    {

        public int ID { get; set; }

        public int ProvinceID { get; set; }

        public string InstitutionName { get; set; }

        public virtual Province Province { get; set; }

    }
}
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using SMOSystemv2.Models;

namespace SMOSystemv2.Controllers
{
    public class InstitutionsController : Controller
    {
        private SMOSystemv2Context db = new SMOSystemv2Context();

        // GET: Institutions
        public ActionResult Index()
        {
            var institutions = db.Institutions.Include(i => i.Province);
            return View(institutions.ToList());
        }

        // GET: Institutions/Create
        public ActionResult Create()
        {

            ViewBag.RegionList = new SelectList(GetRegionList(), "ID", "RegionName");

            return View();
        }

        public List<Region> GetRegionList()
        {
            List<Region> regions = db.Regions.ToList();
            return regions;
        }

        public ActionResult GetProvinceList(int RegionID)
        {
            List<Province> provinceList = db.Provinces.Where(x => x.RegionID == RegionID).ToList();

            ViewBag.ProvinceOptions = new SelectList(provinceList, "ProvinceID", "ProvinceName");
            return PartialView("ProvinceOptionPartial");
        }


        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
@model SMOSystemv2.Models.Institution

@{
    ViewBag.Title = "Create";
}

<h2>Add</h2>


@using (Html.BeginForm())
{

    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Institution</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.Province.RegionID, "RegionID", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">

    @if (ViewBag.RegionList != null)
    {

                @Html.DropDownListFor(m => m.Province.RegionID, ViewBag.RegionList as SelectList, "--Select Region--", new { @class = "form-control", @id = "RegionDDL"})
    }

            @Html.ValidationMessageFor(model => model.Province.RegionID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.ProvinceID, "ProvinceID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">

    @Html.DropDownListFor(m => m.ProvinceID, new SelectList(""), "--Select Province--", new { @class = "form-control"})

                @Html.ValidationMessageFor(model => model.ProvinceID, "", new { @class = "text-danger" })
        </div>
    </div>


        <div class="form-group">
            @Html.LabelFor(model => model.InstitutionName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.InstitutionName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.InstitutionName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>



@section Scripts {

    @Scripts.Render("~/bundles/jqueryval")

<script>
        $(document).ready(function () {

            $("#RegionDDL").change(function () {

                var regionID = $(this).val();
                debugger
                $.ajax({

                    type: "POST",
                    url: "/Institutions/Create/GetProvinceList?RegionID=" + regionID,
                    contentType: "html",

                    success: function (response) {
                        debugger
                        $("#ProvinceID").empty();
                        $("#ProvinceID").append(response);

                    }
                })
            })
        })
</script>
}
<option value="">--Select Province--</option>

@if(ViewBag.ProvinceeOptions != null)
{
    foreach (var item in ViewBag.ProvinceOptions )
    {
        <option value="@item.Value">@item.Text</option>

    }
}