2011-09-17 3 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); 
     } 
    }); 
} 

где контроллер выглядит следующим образом:

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

Страница должна показать объект, который отправляется на сервер, и показать вам порядок выполнения для успеха/ошибки/полных вызовов.

Смежные вопросы