[.NET][MVC]如何使用Ajax Helper

之前寫MVC的時候

常常都會不小心看到這個Intellisense

看起來跟HtmlBeginForm有點像

但是用起來又不能work

最後就放棄了

直到最近才好不容易搞懂它的基本用法

趁著還有印象的時候趕緊紀錄一下~~

首先我們先開啟一個空白的MVC專案

好了之後為了方便區隔

另外新建一個控制器AjaxDemoController.cs

接著我們幫Index新增一個View

好了之後

我們先把Index的外觀改變一下

Index.cshtml

<h2>MVCAjaxDemo</h2>


@using (Html.BeginForm())
{
    <div class="well">
        <div class="row">
            @Html.Label("你的名字", new { @class = "col-sm-2 control-label" })
            <div class="col-sm-10">
                @Html.Editor("name", new { htmlAttributes = new { @class = "form-control", @placehodler = "請輸入你的名字" } })
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-offset-8 col-sm-4">
                <button type="submit" class="btn btn-primary">送出</button>
            </div>
        </div>
    </div>
}

<div class="alert-danger">
    你的名字是
</div>

接著按下Ctrl+F5打開頁面應該會長這樣

但是因為預設並沒有自動幫你把Ajax相應的Script包進來

所以這邊我們必須自己手動下載一下

好了之後在Index.cshtml把Script加入參考

接著修改一下原本的form

Html.BeginForm改成Ajax.BeginForm

然後在AjaxOption裡面設定兩個參數

UpdateTargetId:指定你要更新的目標Id

Url:告訴Ajax要打到後端的哪個Controller裡面對應的Action

 

Index.cshtml


@{
    ViewBag.Title = "Index";
}

<h2>MVCAjaxDemo</h2>

@using (Ajax.BeginForm(new AjaxOptions
{
    UpdateTargetId = "ajaxTargetDiv",
    Url = Url.Action("GetName")
}))
{
    <div class="well">
        <div class="row">
            @Html.Label("你的名字", new { @class = "col-sm-2 control-label" })
            <div class="col-sm-10">
                @Html.Editor("name", new { htmlAttributes = new { @class = "form-control", @placehodler = "請輸入你的名字" } })
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-offset-8 col-sm-4">
                <button type="submit" class="btn btn-primary">送出</button>
            </div>
        </div>
    </div>
}

<div class="alert-danger ">
    你的名字是
</div>

@section scripts{
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>    
}

好了之後還差最後一步-把要更新的部分抽成一個ChildAction

首先我們先在Controller建立一個ChildAction

然後把原本要更新的部分抽成GetNamePartialView

GetName.cshtml

@model string

<div class="alert-danger ">
    你的名字是@model
</div>

最後再把ChildAction放到要更新的div裡面

Index.cshtml


@{
    ViewBag.Title = "Index";
}

<h2>MVCAjaxDemo</h2>

@using (Ajax.BeginForm(new AjaxOptions
{
    UpdateTargetId = "ajaxTargetDiv",
    Url = Url.Action("GetName")
}))
{
    <div class="well">
        <div class="row">
            @Html.Label("你的名字", new { @class = "col-sm-2 control-label" })
            <div class="col-sm-10">
                @Html.Editor("name", new { htmlAttributes = new { @class = "form-control", @placehodler = "請輸入你的名字" } })
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-offset-8 col-sm-4">
                <button type="submit" class="btn btn-primary">送出</button>
            </div>
        </div>
    </div>
}

<div id="ajaxTargetDiv">
    @Html.Action("GetName")
</div>

@section scripts{
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>    
}

最後測試一下

GitHub:https://github.com/wtx2043pp986/MVCAjaxDemo/

如果有打錯的歡迎大大指正喔