iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 23
5
Modern Web

ASP.NET MVC網頁程式介紹系列 第 23

[Day 23] 當ASP.NET MVC遇到Ajax (一)

今年的第一篇文章!

現在要開始寫一個簡單的登入功能,
要登入當然就要有帳號跟密碼,
所以今天就要先開始做建立帳號的部分,

首先做了一個簡單的頁面,
因為是示範的所以欄位越少越好,
/images/emoticon/emoticon39.gif

就這麼簡單
https://ithelp.ithome.com.tw/upload/images/20180101/20105694EqNXaxNjbP.jpg

首先我們要從縣市的下拉轉換中,
從資料庫讀出鄉鎮的列表,
於是我們選擇了不同的縣市,
發現下拉選單真的改變了,
https://ithelp.ithome.com.tw/upload/images/20180101/20105694C4zptgUWWU.jpg

有沒有很神奇啊!
(謎之聲:並沒有好嗎!?)

這是用到了標題上寫的Ajax,
(啊,忘了先來一天份的名詞解釋,那這次就算了)

首先從後端帶縣市的資料到前端,
這部分之前有說明過

MyDataBase db = new MyDataBase();
public ActionResult Index()
{
    List<City> cityList = db.GetCityList();

    ViewBag.CityList = cityList;
    return View();
}

這次我將所有跟資料庫連線的部分都放在一個名為MyDataBase的函式,
集中管理比較符合物件導向的概念,可以重複使用,主程式看起來也比較整潔,
那這是取得縣市列表的Function,

public List<City> GetCityList()
{
    try
    {
        Connect();
        string sql = @" SELECT `id`, `city` FROM `city`";
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        List<City> list = new List<City>();

        using (MySqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                City city = new City();
                city.CityId = dr["id"].ToString();
                city.CityName = dr["city"].ToString();
                list.Add(city);
            }
        }
        return list;
    }
    catch(Exception ex)
    {
        string error = ex.ToString();
        return null;
    }
    finally
    {
        Disconnect();
    }
}

這部分之前有說明過就不多做說明了

這是呼叫Ajax的部分

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    $("#city").change(function () {
        var value = $("#city").val();
        console.log(value);
        $.ajax({
            type: "Post",
            url: "../Home/Village?id=" + value,
            data: '{}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false,
            success: function (data) {
                $("#village").empty();
                if (data == "") {
                    $("#village").append("<option value=''>請選擇縣市</option>");
                }
                else {
                    var jo = JSON.parse(data);
                    $("#village").append("<option value=''>請選擇</option>");
                    for (i = 0; i < jo.length; i++) {
                        $("#village").append("<option value='" + jo[i].VillageId + "'>" + jo[i].VillageName + "</option>");
                    }
                }
            },
            failure: function (errMsg) {
                $("#village").empty();
                $("#village").append("<option value=''>請選擇縣市</option>");
            }
        })
    });
</script>

簡單來說,如果沒成功抓到資料,就顯示預設的"請選擇縣市",如果有抓到資料,就會顯示列表

完整的前端部分如下:

@{
    ViewBag.Title = "Home Page";
    Layout = null;

    var cityList = ViewBag.CityList;
}

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")

<form style="margin-left:10px;">
    <h1>請輸入使用者資料</h1>
    <div class="form-group">
        <label for="exampleInputEmail1">帳號</label>
        <input type="text" class="form-control" id="Account" name="account" placeholder="輸入帳號" value="">
        <small id="emailHelp" class="form-text text-muted">請輸入英數字</small>
    </div>
    <div class="form-group">
        <label for="exampleInputPassword1">新的密碼</label>
        <input type="text" class="form-control" id="Password1" name="password1" placeholder="輸入密碼" value="">
    </div>
    <div class="form-group">
        <label for="exampleInputPassword1">再次確認</label>
        <input type="text" class="form-control" id="Password2" name="password1" placeholder="輸入密碼" value="">
    </div>
    <div class="form-group">
        <label for="Address">地址</label>
        <select id="city" name="city">
            <option value="">全部</option>
            @for(int i=0;i<cityList.Count;i++)
            {
                <option value="@cityList[i].CityId">@cityList[i].CityName</option>
            }
        </select>
        <select id="village" name="village">
            <option value="">請選擇縣市</option>
        </select>
        <input type="text" class="form-control" id="Address" name="address" placeholder="輸入地址" value="">
    </div>
    <button type="submit" class="btn btn-primary">確定</button>
    <button type="reset" class="btn btn-warning">清除</button>
</form>

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    $("#city").change(function () {
        var value = $("#city").val();
        console.log(value);
        $.ajax({
            type: "Post",
            url: "../Home/Village?id=" + value,
            data: '{}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false,
            success: function (data) {
                $("#village").empty();
                if (data == "") {
                    $("#village").append("<option value=''>請選擇縣市</option>");
                }
                else {
                    var jo = JSON.parse(data);
                    $("#village").append("<option value=''>請選擇</option>");
                    for (i = 0; i < jo.length; i++) {
                        $("#village").append("<option value='" + jo[i].VillageId + "'>" + jo[i].VillageName + "</option>");
                    }
                }
            },
            failure: function (errMsg) {
                $("#village").empty();
                $("#village").append("<option value=''>請選擇縣市</option>");
            }
        })
    });
</script>

後端的部分就等明天再說明了,
欲知後事如何,請待下回分解~


上一篇
[Day 22] C#中Json的序列化和反序列化的幾種方式(三)
下一篇
[Day 24] 當ASP.NET MVC遇到Ajax (二)
系列文
ASP.NET MVC網頁程式介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
leo226
iT邦新手 4 級 ‧ 2019-07-17 15:44:54

請問這樣寫的意思是同時可以接收POST和GET的值嗎?
不然為什麼POST不改為Get?
而下一篇後端也是有下[HttpPost],觀念有點不懂~

type: "Post",
url: "../Home/Village?id=" + value,
小魚 iT邦大師 1 級 ‧ 2019-07-17 15:48:55 檢舉

既然看到Post,
當然就是Post,
Get跟Post一次只會有一種請求,

[HttpPost] 那是ASP.NET MVC針對接收Post必須有的,
如果沒有的話就是Get.
你不是也在寫嗎?
應該知道這件事吧...

leo226 iT邦新手 4 級 ‧ 2019-07-17 17:14:21 檢舉

嗯,大大您說明的我懂,我只是不解為什麼id=" + value這一個Get的值也能同時被使用?

url: "../Home/Village?id=" + value,
小魚 iT邦大師 1 級 ‧ 2019-07-17 17:36:49 檢舉

他其實還是透過POST的方式傳的,
不過我用網路上的data的方式好像常常不成功...

0
noway
iT邦研究生 4 級 ‧ 2019-09-20 11:04:53

您好:
請問 是否可提供 您 MyDataBase 的程式碼呢?
謝謝!

小魚 iT邦大師 1 級 ‧ 2019-09-20 11:40:37 檢舉

這篇已經快2年前了,
當時的測試專案應該不知道跑哪去了,
後端的部分基本上可以看隔天的文章,
應該就蠻清楚的了.

剛剛看了一下,
這篇文章的

public List<City> GetCityList()

就是MyDataBase的函式了.

我要留言

立即登入留言