2011-09-17 28 views
3

入力フィールドをフォーム/ 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); 
     } 
    }); 
} 

:私は同じことをするだろう標準を見つけられませんでしたので、CNameValueクラスは、私自身の創造である

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

もの。パラメータを名前で選択する標準の辞書クラスが必要ですか?私の質問は、これをどうやってやるのですか?

セカンドバリエーション:

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 }; 
    } 

ページでは、サーバーに送信されたオブジェクトを表示し、あなたの成功/エラー/完全な呼び出しのための実行順序を示すべきです。

関連する問題