我正在嘗試使用Ajax(我認爲)調用來更新我的模型值,然後在視圖中反映出新的值。目前我只是將它用於測試目的。通過Ajax Post更新模型更改視圖MVC3
這裏的概述:
模型
public class MyModel
{
public int Integer { get; set; }
public string Str { get; set; }
}
控制器
public ActionResult Index()
{
var m = new MyModel();
return View("Test1", m);
}
[HttpPost]
public ActionResult ChangeTheValue(MyModel model)
{
var m = new MyModel();
m.Str = model.Str;
m.Str = m.Str + " Changed! ";
m.Integer++;
return View("Test1", m);
}
VIEW
@model Test_Telerik_MVC.Models.MyModel
@using Test_Telerik_MVC.Models
@{
ViewBag.Title = "Test1";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>
Test1</h2>
@if (false)
{
<script src="~/Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery-ui.min.js" type="text/javascript"></script>
}
<h2>
ViewPage1
</h2>
<div>
<input type="button" onclick="changeButtonClicked()" id="changeButton" value="Click Me!" />
<input type="text" value="@Model.Str" class="txt" id="str" name="Str"/>
<div></div>
</div>
<script type="text/javascript">
function changeButtonClicked() {
var url = '@Url.Action("ChangeTheValue", "Test1")';
var data = '@Model';
$.post(url, data, function (view) {
$("#Str").value = '@Model.Str';
});
}
</script>
基本上該視圖呈現一個帶有文本框的按鈕。我唯一的目標是簡單地在文本框中顯示我的模型(Str屬性)的值。
我試過各種組合的changeButtonClicked()函數無濟於事。 Test1是我的控制器的名稱。我不明白的是當我調試它時,控制器操作會觸發並正確設置我的值。如果我在輸入標籤的「@ Model.Str」部分放置一個斷點,它會告訴我,我的@ Model.Str等於Changed!哪個是對的。但是,只要我的成功函數在javascript中觸發,該值就會恢復爲原始值。
我可以通過改變輸入類型來提交和包裝它在@ Html.BeginForm()部分,但我想知道如果/如何做到這一點?或者是提交完成它的唯一方法?
感謝
伴侶,太棒了。我會稍後再說一遍,並讓你知道。我希望你所描述的工作。乾杯 – Jason
好吧,我有它的工作。正如你所說,JSon是在這種情況下走的路。但是,具體設置值仍然意味着我的「模型」對象從不包含更新的值?所以如果我在另一個事件中引用它(例如在這個事件發生後),@ Model.Str實際上並不包含新值。爲了發生這種情況,我需要提交?感謝您的回答。它確實回答了我最初的問題。 – Jason
如果你想獲得你輸入的最新值,你需要從輸入本身獲得它們,你可以用jQuery $(#Str).val()來獲得它。否則,如果您在JavaScript代碼的其他地方使用Model.Str,那麼在頁面第一次加載時將設置Model.Str的值,並且永遠不會更新,除非您進行整頁刷新。 – ajrawson