【发布时间】:2017-12-28 17:02:05
【问题描述】:
我是 MVC 和 Razor 的新手,看过很多关于这方面的示例和教程,但无法让它发挥作用。看起来很简单,但我认为我正在尝试使用存储过程这一事实使一切变得复杂。
我正在尝试使用存储过程和实体框架在 MVC 中创建一些简单的级联下拉列表。
我的实体由以下存储过程组成:
exec prcGetMakes
exec prcGetModels 'BMW'
exec prcGetVariants '1 SERIES 5-DOOR'
我创建了一个名为 VehicleViewModel 的视图模型类:
public class VehicleViewModel
{
[Display(Name = "Manufacturer")]
public string BrandName { get; set; }
public string BrandID { get; set; }
[Display(Name = "Model")]
public string ModelName { get; set; }
public string ModelID { get; set; }
[Display(Name = "Variant")]
public string VariantName { get; set; }
public IEnumerable<SelectListItem> Manufacturer { get; set; }
public IEnumerable<SelectListItem> Model { get; set; }
public IEnumerable<SelectListItem> Variant { get; set; }
}
我正在使用名为 HomeController.cs 的默认控制器类:
public class HomeController : Controller
{
VehicleInfoEntities db = new VehicleInfoEntities();
public ActionResult Index()
{
var app = new VehicleViewModel
{
Manufacturer = GetMakes()
};
return View(app);
}
private IEnumerable<SelectListItem> GetMakes()
{
var list = new VehicleViewModel();
IEnumerable<SelectListItem> manufacturer = from s in db.prcGetMakes(null)
select new SelectListItem
{
Selected = s.ToString() == "Active",
Text = s.BrandName,
Value = s.BrandID
};
return manufacturer;
}
private IEnumerable<SelectListItem> GetModels(string brandName)
{
var list = new VehicleViewModel();
IEnumerable<SelectListItem> models = from s in db.prcGetModels(brandName)
select new SelectListItem
{
Selected = s.ToString() == "Active",
Text = s.ModelName,
Value = s.ModelID
};
return models;
}
private IEnumerable<SelectListItem> GetVariants(string modelName)
{
var list = new VehicleViewModel();
IEnumerable<SelectListItem> variants = from s in db.prcGetVariants(modelName)
select new SelectListItem
{
Selected = s.ToString() == "Active",
Text = s.VariantName,
Value = s.VariantName
};
return variants;
}
}
这是我的看法
@model WebApplication12.Models.VehicleViewModel
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Index", "Sample", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<div class="form-group" style="text-align:left;">
@Html.Label("Manufacturer:", new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.DropDownList("Manufacturer", ViewData["Manufacturer"] as SelectList, new { @class = "form-control" })
</div>
</div><br />
}
期望的结果是
我现在只想知道如何使用 JQuery 使级联 DropDown 工作并过滤每个 DropDown 的选择。
【问题讨论】:
-
你当然可以使用存储过程,尽管像查找表这样的事情在普通实体框架中非常简单。您可能希望开发一个 Vehicle 实体模型,该模型很可能具有 VehicleId、ManufacturerId、ModelId、VariantId 等字段。然后您可能会创建一个 VehicleViewModel,其中您将拥有 View 所需的东西,例如下拉列表集合,等等然后你的控制器填充视图模型并显示视图。那里有很多很好的教程。
-
谢谢,链接中的解决方案不起作用,存在拼写错误,并且 public ActionResult Create() 给出错误“并非所有代码路径都返回一个值”,我将如何使用实体框架?
-
@SteveGreene 感谢您的回答和建议。我很清楚你在说什么,并且我看过很多教程,但我希望基于我的实际实体和模型的特定代码作为示例。正如我所说,我是 MVC 的新手。你是对的,有很多教程,但没有一个使用我的模型和实体,作为初学者,很难适应现有的教程。
-
您可能一次咬得太多。也许从一个只有 VehicleId 和 VehicleDescription 的简单车辆模型开始。让模型、视图和控制器 CRUD 正常工作。然后添加一个下拉列表。然后做级联部分。等等。
标签: jquery asp.net-mvc entity-framework stored-procedures cascadingdropdown