我在ASP.NET MVC4中有一个小测试程序,允许您从下拉菜单中选择项目。它使用Json
和JavaScript
(我根本不熟悉这些)。
这是我目前的代码:
的HomeController :
public ActionResult CountryList()
{
IQueryable countries = Country.GetCountries();
if (HttpContext.Request.IsAjaxRequest())
{
return Json(new SelectList(
countries,
"CountryCode",
"CountryName"), JsonRequestBehavior.AllowGet
);
}
return View(countries);
}
public ActionResult StateList(string CountryCode)
{
IQueryable states = State.GetStates().Where(x => x.CountryCode == CountryCode);
if (HttpContext.Request.IsAjaxRequest())
return Json(new SelectList(
states,
"StateID",
"StateName"), JsonRequestBehavior.AllowGet
);
return View(states);
}
查看:
@section scripts {
<script type="text/javascript">
$(function () {
$.getJSON("/Home/Countries/List", function (data) {
var items = "<option>---------------------</option>";
$.each(data, function (i, country) {
items += "<option value='" + country.Value + "'>" + country.Text + "</option>";
});
$("#Countries").html(items);
});
$("#Countries").change(function () {
$.getJSON("/Home/States/List/" + $("#Countries > option:selected").attr("value"), function (data) {
var items = "<option>---------------------</option>";
$.each(data, function (i, state) {
items += "<option value='" + state.Value + "'>" + state.Text + "</option>";
});
$("#States").html(items);
});
});
});
</script>
}
<h1>@ViewBag.Title</h1>
@using (Html.BeginForm())
{
<label for="Countries">Countries</label>
<select id="Countries" name="Countries"></select>
<br /><br />
<label for="States">States</label>
<select id="States" name="States"></select>
<br /><br />
<input type="submit" value="Submit" />
}
最后是模型:
国家
public class Country
{
public string CountryCode { get; set; }
public string CountryName { get; set; }
public static IQueryable<Country> GetCountries()
{
return new List<Country>
{
new Country {
CountryCode = "CA",
CountryName = "Canada"
},
new Country{
CountryCode = "US",
CountryName = "United-States"
}
}.AsQueryable();
}
}
}
国家:
public class State
{
public string CountryCode { get; set; }
public int StateID { get; set; }
public string StateName { get; set; }
public static IQueryable<State> GetStates()
{
return new List<State>
{
new State
{
CountryCode = "CA",
StateID=1,
StateName = "Ontario"
},
new State
{
CountryCode = "CA",
StateID=2,
StateName = "Quebec"
},
new State
{
CountryCode = "CA",
StateID=3,
StateName = "Nova Scotia"
// .. and so on
}.AsQueryable();
}
}
}
我的问题是:如何使此解决方案适用于数据库表?为了使相同的下拉列表与数据库中的字段一起工作,我需要做什么?有没有人有他们推荐的任何有用的教程?
答案 0 :(得分:0)
如果您需要从数据库中获取国家/地区列表,那么您需要做的是能够查询数据库。请参阅使用ado.net查询数据库的这些示例。 https://msdn.microsoft.com/en-us/library/vstudio/dw70f090%28v=vs.100%29.aspx
然后只需更改.GetCountries和GetStates即可从数据库中获取列表。代码看起来像这样(这只是伪代码)
var List<States> l = new List<States>();
while(reader.read()){
var s = new State{
CountryCode = reader["cc_code"],
StateID=reader["stateId"],
StateName = reader["stateName"]
};
l.add(s);
}
return l;
答案 1 :(得分:0)
您需要选择访问数据库的方式。有很多选项,但我建议您使用某种ORM。选择ORM也不容易。因此,您需要先进行研究,找到最符合您需求的研究。正如您在评论中所写,您对此不熟悉,因此我将提供一些示例,了解States
在不同ORM中的提取方式。
Dapper - 此(SO)网站上使用的ORM。
using (var conn = new SqlConnection("CONN_STR"))
{
IList<State> states = conn
.Query<State>(
"select * States where CountryCode = @CountryCode",
new { CountryCode = countryCode })
.ToList();
}
正如你在这里看到的那样,我们只提供SQL和带有参数的对象,Dapper为我们做了所有事情。我们得到实体列表。
Entity Framework - 由Microsoft创建的ORM。
IList<State> states =
DbContext.States.Where(state => state.CountryCode == countryCode).ToList();
您根本不需要编写任何SQL,我们使用的是纯LINQ语法。
当然,所有ORM都有其优点和缺点,所以你需要先做一个研究。
编辑:看来填充选择时遇到问题......然后首先需要为EF创建正确的模型。您可以重复使用现有模型,只需添加一些属性:
[Table("Countries")]
public class Country
{
public string CountryCode { get; set; }
public string CountryName { get; set; }
}
[Table("States")]
public class State
{
[Key]
public int StateID { get; set; }
public string StateName { get; set; }
public string CountryCode { get; set; }
}
在Table
属性中,您当然应该使用真实的表名。然后,您需要创建DbContext
:
public class MyDbContext : DbContext
{
public DbSet<Country> Countries { get; set; }
public DbSet<State> States { get; set; }
}
不要忘记在web.config中指定连接字符串,如教程中所示。
我简化了获取国家和州的方法,现在他们只返回JSON:
public ActionResult CountryList()
{
using (var db = new MyDbContext())
{
var countries = db.Countries.ToList();
return Json(
new SelectList(countries, "CountryCode", "CountryName"), JsonRequestBehavior.AllowGet);
}
}
public ActionResult StateList(string countryCode)
{
using (var db = new MyDbContext())
{
var states = !string.IsNullOrEmpty(countryCode)
? db.States.Where(state => state.CountryCode == countryCode).ToList()
: new List<State>();
return Json(
new SelectList(states, "StateID", "StateName"), JsonRequestBehavior.AllowGet);
}
}
将数据库访问代码移到不同的类是个好主意,但我希望你能自己做。
你在javascript中有一些奇怪的URl,所以这里有一个例子:
$.getJSON("/Home/CountryList", function (data) {
// Same code that you have
});
$("#Countries").change(function () {
$.getJSON("/Home/StateList?countryCode=" + $("#Countries > option:selected").attr("value"), function (data) {
// Same code that you have
});
});