C# MVC应用程序中基本脚手架积垢上的级联下拉列表 一些背景:
您好,我是一名初级程序员,几周前才通过教程学习了ASP.net MVC,我成功地根据我的模型搭建了控制器和视图,实体通过外键与其他实体建立了关系,所以不算太远。到目前为止,我严重依赖Visual Studio 2017提供给我的自动过程,例如我的创建表单自动生成一个由另一个表中的数据填充的Dropdownlist 问题是: 然而,我现在正在努力根据我从另一个dropdownlist中选择的内容过滤这个dropdownlist,我了解到我正在寻找的解决方案是围绕级联Dropdownlists展开的。我的情况很像通常的Country State示例,其中State dropdownlist由我从Country dropdownlist中选择的内容填充。我已经接受了必须使用另一种语言(如jquery/ajax)来实现这一点,但我使用的所有解决方案要么看起来与我正在做的太不一样,要么对我来说太高级。我非常努力地学习这一点,但我担心我最终会失败,因为我只使用内置的脚手架来设置我的路线、连接和数据库。我已经在寻找与我背景相同的解决方案,但似乎找不到一个 应用程序 复制我的代码并不难,因为正如我所说,我只是按照基本的说明来制作MVC应用程序,而且几乎所有的代码都是搭建起来的。因此,一般设置如下: 模型 区域实体(如国家) 控制器 我为这些实体提供的控制器基本上是脚手架从一开始就提供给您的,除了在我开始实施我搜索的级联下拉列表解决方案时InstitutionsController中的一些更改(请参见Create、GetRegionList和GetProvinceList方法) 机构控制员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展开的
使用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>
}
}