2011-09-17 89 views
3

有各種類型的帖子,關於從form/div獲取輸入字段並將它們發送到您的服務器端控制器。我不清楚的是如何接受控制器的輸入。ASP.NET MVC Razor - 將數據發送到控制器

我已經嘗試了各種方法:

function SendEMail(vThis) 
{ 
    var vInput = $("#idEMailFields *").serializeArray(); 

    $.ajax({ 
     url: '@Url.Action("SendEMail", "TournMaint")', 
     data: JSON.stringify(vInput), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8;', 
     dataType: 'json', 
     success: function (response) 
     { 
      $("#idEMailResponse").html(response); 
      return; 
     }, 
     error: function(xhr, status, error) 
     { 
      debugger; 
      var verr = xhr.status + "\r\n" + status + "\r\n" + error; 
      alert(verr); 
     } 
    }); 
} 

其中控制器的樣子:

[HttpPost] 
public JsonResult SendEMail(CNameValue [] inputs) 
{ 
    String sView = "EMail messages queued"; 
    return Json(sView, JsonRequestBehavior.AllowGet); 
} 

的CNameValue類是我自己創作的,因爲我沒有找到一個標準,會做同樣的事情。應該有一個標準的字典類,它會按名稱選擇參數?我的問題是如何做到這一點?

第二變化:

function SendEMail(vThis) 
{ 
    var params = {}; 
    var v1 = $("#idEMailFields input[name=EMailAddressing], #idEMailFields input[type=hidden],#idEMailFields textarea"); 
    $(v1).each(function(index) 
    { 
     params[this.name]=this.value; 
    }); 
    $.ajax({ 
     url: '@Url.Action("SendEMail", "TournMaint")', 
     data: JSON.stringify(params), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8;', 
     dataType: 'json', 
     success: function (response) 
     { 
      debugger; 
      return; 
     }, 
     error: function (x) 
     { 
      debugger; 
      alert(x.status); 
     } 
    }); 
} 

在控制器的樣子:

[HttpPost] 
public JsonResult SendEMail(Int32 TournamentId, String EMailText, String EMailAddressing) 
{ 
    String sView = "return something usefull"; 
    return Json(sView, JsonRequestBehavior.AllowGet); 
} 

這並不是將數據移動到服務器一個壞的方式,但它易於在剃刀標記變化導致控制器爆炸。我知道你永遠不會擺脫這個問題,但減少可能性是一個想法。

什麼是獲取屏幕數據到服務器端控制器的最佳方式是什麼?

回答

8

如果您正在使用強類型的意見,那麼所有你需要做的就是

$.ajax({ 
     url: '@Url.Action("SendEMail", "TournMaint")', 
     data: {model:JSON.stringify(vInput)}, 
     type: 'POST', 
    ... 

和控制器看起來像

[HttpPost] 
public JsonResult SendEMail(CNameValue model) 
{ 
    String prop = model.YourModelProperty; 

你也可以使用表單收集

$.ajax({ 
     url: '@Url.Action("SendEMail", "TournMaint")', 
     data: {col :$("Formid").serialize()}, 
     type: 'POST', 
    ... 

和控制器看起來像

[HttpPost] 
public JsonResult SendEMail(FormCollection col) 
{ 
    String prop = col.Get("FormFieldName"); 
2

.post()語法@http://api.jquery.com/jQuery.post/比.ajax imo更好。例如:

$(document).ready(function() 
{ 
    var model = 
    { 
     EmailAddress: 'Hello, World!' 
    }; 

    var xhr = $.post('@Url.Action("SendEmail", "TournMaint")', model) 
     .success(function(data) 
     { 
        $('body').append('!success!'); 
        $('body').append(JSON.stringify(data)); 
     }) 
     .error(function() 
     { 
        $('body').append('!err!'); 
     }) 
     .complete(function() 
     { 
        $('body').append('!complete!'); 
     }); 
    }); 

控制器可能看起來像:

public class MyModel { public string EmailAddress { get; set; } }; 

    [HttpPost] 
    public JsonResult SendEmail(MyModel model) 
    { 
     return new JsonResult { Data = model }; 
    } 

的頁面中就可以顯示發送到服務器的對象,並告訴你執行的成功/錯誤/完整的呼叫順序。

相關問題