从数据库中检索字段而不模拟它们?

时间:2015-04-09 12:34:17

标签: javascript c# asp.net json asp.net-mvc-4

我在ASP.NET MVC4中有一个小测试程序,允许您从下拉菜单中选择项目。它使用JsonJavaScript(我根本不熟悉这些)。

这是我目前的代码:

的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();

        }
    } 
}

我的问题是:如何使此解决方案适用于数据库表?为了使相同的下拉列表与数据库中的字段一起工作,我需要做什么?有没有人有他们推荐的任何有用的教程?

2 个答案:

答案 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
    });
});