iT邦幫忙

0

如何在View上呼叫Controller的方法並得到回傳的結果

  • 分享至 

  • xImage

目前是希望可以在View上的number輸入值(預想是工號),然後當這欄位有onchange時,我可以將輸入值帶到Controller,並在Controller透過連資料庫尋找相關資料(找工號的姓名等資訊),但我目前尚未實作出後面(先寫死)。
備註,在這頁所有事情都做完以後,才送出資料(Submit)

目前輸入值到number中,沒有任何動作,請問我該如何去透過ajax將輸入值帶到Controller,並回傳結果到頁面上的欄位呢?

[View]

<script type="text/javascript">
    $("#myAjaxButton").click( function (event) {
        $.ajax({
            url: "@Url.Action("TestFunc", "Test")",
            data: { number = $("#number").val() },
            cache: false,
            type: "POST",

            success: function (data, textStatus, jqXHR) {
                $("#name").val(data);
            },
            error: function (jqXHR, textStatus, errorThrown) { 
                alert("Found error when using Ajax!!");
            }
        });
    });
</script>

@using (Html.BeginForm("Index","Test",FormMethod.Post,new {})){
    <div class="form-horizontal">
		<div class="form-group">
			<div class="col-md-10">
                <p>Id : </p>
				<input type="text" id="number" required />
                <input type="text" id="name"/>
			</div>
		</div>

		<div class="form-group">
			<div class="col-md-offset-2 col-md-10">
                <input type="button" id="myAjaxButton" value="search1" class="btn btn-default" />
				<input type="submit" value="search" class="btn btn-default" />
			</div>
		</div>
    </div>
}

[Controller]

[HttpPost]
public JsonResult TestFunc(string number) {
    string name = "";
    
    if (number == "A12345")
    {
        name = "Annie";
    };
    
    return Json(name);
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
YoChen
iT邦研究生 1 級 ‧ 2019-11-27 16:48:08
最佳解答

首先,您可以先在Controller製作出一個簡易的API並回傳Json,既然是回傳Json那就使用JsonResult就好,不過ActionResult也可以

[HttpPost]
public JsonResult TestFunc(string number) {
    string hashNumber = number;
    string name = "";
    
    if (number == "A12345")
    {
        name = "Annie";
    };
    
    return Json(name);
}

接著準備對應的Javascript
注: 建議您不要寫在onchange裡面,不然您每輸入一個字都會執行一次Ajax

感謝Firecold大糾正
onchange 要input unfocus才會觸發

$("#myAjaxButton").click( function () {
    $.ajax({
        url: "@Url.Action("TestFunc", "Test")",
        data: { "number": $("#number").val() }, // 變數名稱必須跟Action裡的相同
        cache: false,
        type: "POST",

        success: function (data, textStatus, jqXHR) {
            $("#name").val(data);
        },
        error: function (jqXHR, textStatus, errorThrown) { 
            alert("Found error when using Ajax!!");
            // 記得要加入error handler不然很難除錯XDDD
        }
    });
});
看更多先前的回應...收起先前的回應...
anniecat iT邦新手 3 級 ‧ 2019-11-27 17:17:25 檢舉

YoChen,目前調整程式碼後,嘗試了以下方式,但看起來都未觸發事件,請問還可以怎麼調整呢? 非常謝謝您!

  1. 嘗試原本的觸發事件(.change),輸入值未觸發事件
  2. 嘗試新增一個按鈕myAjaxButton,並調整觸發方式為(改為.cliclk),但目前按下按鈕myAjaxButton,未觸發事件
  3. 調整Controller的方法為JsonResult,未觸發事件

目前程式碼更新於發問中~

YoChen iT邦研究生 1 級 ‧ 2019-11-27 17:25:39 檢舉

請確認您Ajax裡的data有沒有填錯

data: { "number": $("#number").val() }, 
// 變數名稱必須跟Action裡的相同
anniecat iT邦新手 3 級 ‧ 2019-11-27 17:29:08 檢舉

不好意思!我剛剛太慢送出發問...
有的,我有確認其一致性,只是不知道為什麼它都不會做觸發,目前我中斷點是下在Controller裡面

YoChen iT邦研究生 1 級 ‧ 2019-11-27 17:34:59 檢舉

如果都沒有填錯的話,您可能要在瀏覽器點開F12看看有沒有錯誤訊息

dragonH iT邦超人 5 級 ‧ 2019-11-27 17:35:14 檢舉

把你的 script block 移到 html dom block 後面你覺得如何

anniecat iT邦新手 3 級 ‧ 2019-11-27 17:39:48 檢舉

YoChen 目前看起來是這段有問題
data: { "number" = $("#number").val() }

Uncaught SyntaxError: Invalid shorthand property initializer

有嘗試將=改成:,console就沒有錯誤了,但還是一樣不會觸發,我再試試看,感謝您!

dragonH,有嘗試過,看起來應該跟順序沒有關係,謝謝您!

dragonH iT邦超人 5 級 ‧ 2019-11-27 17:45:16 檢舉

但是 json 一定是不能寫成 key=value 的型式的

所以一定是 key: value

或許可以看一下

最後到 html 的 code 長怎樣

YoChen iT邦研究生 1 級 ‧ 2019-11-27 17:47:12 檢舉

如同DragonH大所說,您可以先改成key: value,再看看有什麼錯誤訊息~

anniecat iT邦新手 3 級 ‧ 2019-11-27 17:48:53 檢舉

有的,有嘗試將=改成:,console就沒有錯誤了,只是一樣不會觸發,我再試試看,不好意思,耽誤您們這麼多時間> <

dragonH iT邦超人 5 級 ‧ 2019-11-27 17:52:34 檢舉

我還是覺得是順序的問題就是

不然可以試試 $(document).ready() {}

把 function 寫在裡面試試

YoChen iT邦研究生 1 級 ‧ 2019-11-27 18:02:45 檢舉

哇,感覺這一手有突破盲點~XDDD

小魚 iT邦大師 1 級 ‧ 2019-11-27 18:06:59 檢舉

有可能是順序的問題.

dragonH iT邦超人 5 級 ‧ 2019-11-27 18:10:15 檢舉

其實也不能說是 "順序" 的問題

是因為 dom 還沒 完全 load 的時

js 根本就抓不到 dom

firecold iT邦新手 1 級 ‧ 2019-11-27 18:17:33 檢舉

onchange 要input unfocus才會觸發喔

YoChen iT邦研究生 1 級 ‧ 2019-11-27 18:18:24 檢舉

可以直接去開發者模式的Event Listeners裡面看看click事件有沒有註冊成功~XDDD

YoChen iT邦研究生 1 級 ‧ 2019-11-27 18:28:01 檢舉

firecold大感謝,又上了一課~XDDD
已加入註解

anniecat iT邦新手 3 級 ‧ 2019-11-27 21:42:00 檢舉

謝謝dragonHYoChenfirecold的幫忙!
嘗試Event Listeners去看Network後,發現我的程式沒有進入ajax那段,後來發現有兩個問題而導致沒有進入,第一個是我全部都用雙引號,後來調整為單引號包夾雙引號的方式;
url: "@Url.Action("TestFunc", "Test")",
改為
url: '@Url.Action("TestFunc", "Test")',
第二個就是各位提及的順序問題。我將兩個問題調整好以後,就可以呼叫了~

0
小魚
iT邦大師 1 級 ‧ 2019-11-27 16:35:19

Ajax通常是回傳Json字串,
然後前端解析字串再做相應的處理

[HttpPost]
public ActionResult TestFunc(string number) {
    string result = xxx;
    //中間省略

    return Json(result);   
}

類似這樣的,
常常會用到Newtonsoft.Json

anniecat iT邦新手 3 級 ‧ 2019-11-27 16:43:05 檢舉

小魚,謝謝您,已經做修改了,但目前看起來我的onchange事件還是沒有觸發,請問我可以怎麼調整呢?

目前有使用到的

@using Newtonsoft.Json;
@using System;
0
ekkusu
iT邦新手 4 級 ‧ 2019-11-27 17:36:35
    function Show() {
              省略...

    }


<input type="text" id="number" **onkeyup="Show(this.id)"** required />

這樣應該就可以達到你的要求了。
但是...我會覺得用 這個,可以避免你把自己的server跟資料庫弄死

anniecat iT邦新手 3 級 ‧ 2019-11-27 17:41:20 檢舉

謝謝您,這個方法是將東西都寫在View上面,對嗎?
但目前還是希望可以從Controller去作業,感謝您提供的方法!

我要發表回答

立即登入回答