2011-01-27 16 views
4

我使用.NET 4,MVC 3和jQuery創建診斷頁面。此頁面將允許用戶通過呼叫各種Web服務來手動在我們的系統上運行測試。我想在3個獨立的測試視圖上有3個窗體。每個表單提交應該異步返回一個值,以便他們可以僅提交兩個測試,然後在不刷新頁面的情況下查看測試的返回值。使用.NET 4 MVC 3和jQuery更新DIV

在我的PHP日子裏,我會爲每個表單設置一個Ajax調用,然後打開一個服務器端腳本來完成這項工作並返回一個值,但是我在概念上很難將其翻譯過來到MVC解決方案。我會很感激,如果有人會提供一些示例代碼如何實現這一點,並在每個代碼段應該去(視圖,控制器,部分視圖等...)

這似乎很簡單,但我只是可以今天似乎沒有把我的頭圍住它。

在此先感謝...

編輯

埃裏克·索維爾放在一個很大的教訓,教學MVC 3和jQuery的最佳實踐。這是一個小時的時間,包括DDD設計原則和DI,並着重於創建可重用的jQuery代碼。

http://channel9.msdn.com/Series/mvcConf/mvcConf-2-Eric-Sowell-Evolving-Practices-in-Using-jQuery-and-Ajax-in-ASPNET-MVC-Applications

回答

2
  1. 創建控制器來表示您的域中的每個概念。您可能只需要一個「TestsController」。

  2. 爲每個測試創建操作,返回JsonResult。

  3. 爲每個測試編寫功能,構建某種返回對象,然後通過調用Json(result, JsonRequestBehavior.AllowGet)將其序列化。

  4. 在您的home控制器的索引操作中(默認情況下提供了一個新的MVC項目),返回View()並創建相應的View。

  5. 在這個視圖中,使用Jquery調用您的Ajax調用,就像您一直使用的一樣,並顯示結果。對阿賈克斯的網址,電話將是這樣的:

    /測試/ Test1的

+0

Eric Sowell講述了一個很好的教訓,教導了MVC 3和jQuery的最佳實踐,它包括DDD設計原則和DI,並着重於創建可重用的jQuery代碼 http://channel9.msdn.com/Series/mvcConf/mvcConf-2-Eric-Sowell-Evolving-Practices-in-Using-jQuery-and-Ajax-in-ASPNET-MVC-Applications – GregB 2011-10-07 16:35:50

0

局部視圖可能是一個更好的辦法來接近你所需要的。然後你可以單獨調整每個視圖。

2

下面是使用一個單一的形式,作爲一個例子在代碼的簡要介紹。我知道你指定了多個,但它應該相對容易擴展這個

1)爲每個將保存值的表單創建一個PostModel。因此,創建一個models.cs文件,並添加下面的類吧:

public class Form1ViewModel() // This will hold all the fields you need in the form 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    // etc... 
} 
public class Form1PostModel() 
{ 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
    // add for each post value you expect 
} 

public class ReturnModel() // some object to hold the values you want to return 
{ 
    public string Message { get; set; } 
    public bool Success { get; set; } 
} 

2)在你的控制器:HomeController.cs設置如下:

public ActionResult Index() 
{ 
    return View(new Form1Model()); // default view 
} 

[HttpPost] 
public JsonResult Form1(Form1PostModel model) 
{ 
    ReturnModel returnModel = SomeAction(model); 
    return JsonResult(returnModel); 
} 

3)在你的視圖(查看/首頁/索引。CSHTML)你然後顯示這種形式並調用AJAX後:

@using (Html.BeginForm()) { 
    @Html.EditorForModel() 
    <div class="editor-actions"> 
     <input type="button" value="Update" id="btnUpdateForm1" /> 
    </div> 
} 

4)然後jQuery的:

$('#btnUpdateForm1').click(function(){ 
    $.post(
     "/Home/Form1", // url 
     { Value1 : "", Value2 : "" }, // payload 
     function(result) // success 
     { 
     // can access result.Message or result.Success here (I.E fields returned from the model) 
     }, 
     function(msg) // error 
     { 
     alert('Error'); 
     } 
    ); 
    return false; // for the button 
    }); 

希望,給你一個想法..這篇從頭頂,所以請原諒任何小事

0

這就是我做更新的頁面元素的一些信息:

林我的看法Practices.ascx,我已經得到了實踐的一個div更新

<div style=" width:20%; float:right; background-color:inherit" > 
    (Last Seen: <span id="<%: practice.ID %>LastSeenPractice" class="LastSeenPractice" >Loading...</span>) 
</div> 
在Practices.ascx在腳本部分的jQuery

還可以隨時更新的做法,我做它每隔10分鐘:

function UpdatePractice() { 
    jQuery.post("/reporter/LastSeenPractice", $.param({ practiceID: pid, doctorIDs: DoctorIDs }, true), UpdateLastSeenPractice, "json"); 
} 

setInterval(UpdatePractice, 1000*60*10) 

在你的控制器,創建一個函數來收到的jQuery的電話:

[HttpPost] 
public JsonResult LastSeenPractice(string practiceID, List<String> doctorIDs) 
{    
    ... process query ... 
    return Json(new { pid = practiceID, LastSeenPractice = lastSeenPractice, LastSeenDoctor = lastSeenDoctor }); 
} 

,最後回到你的JScript中,創建一個回調函數來處理JSON結果

function UpdateLastSeenPractice(data) { 
    $("#" + data.pid + " .LastSeenPractice").html(data.LastSeenPractice); 
    for (var key in data.LastSeenDoctor) { 
     $("#" + key + " .LastSeenDoctor").html(data.LastSeenDoctor[key]); 
    } 
}; 

這應該是使得使用jQuery

更新一個AJAX調用的基本流程: 忘記問題約局部視圖的一部分。我使用嵌套的部分視圖來降低已經複雜的語法的複雜性。我的每個練習都是在它自己的視圖下,並且index.ascx循環遍歷所有練習,並在treenode中創建一個局部視圖並傳入一個參數(不幸的是,您只能傳入一個參數,因此我將所需的所有設置鑑於字典因此PracticesDict:

<div id="bodyPracticesList" style="float:left; width:100%"> 
    <% Html.RenderPartial("Practices", Model.PracticesDict); %> 
</div> 

我的劇本的一切都在的Index.aspx和HTML是在practices.ascx所以你可以做你的三種形式類似的東西,也就是把它們放在局部視圖正如Max建議打破一切,