ASP.NET MVC Razor - отправка данных на контроллер - PullRequest
3 голосов
/ 17 сентября 2011

Существуют всевозможные сообщения о получении полей ввода из формы / div и их отправке на серверный контроллер.Я не совсем понимаю, как принять ввод на контроллере.

Я пробовал различные методы:

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

Это неплохой способпереместить данные на сервер, но они подвержены изменениям в разметке бритвы, вызывающим взрыв контроллера.Я знаю, что вы никогда не избавитесь от этой проблемы, но подумать об уменьшении этой возможности.

Каков наилучший способ передачи данных экрана на контроллер на стороне сервера?

Ответы [ 2 ]

8 голосов
/ 17 сентября 2011

если вы используете строго типизированные представления, все что вам нужно сделать, это

 $.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 голосов
/ 18 сентября 2011

Синтаксис .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 };
    }

На странице должен отображаться объект, который вы отправили на сервер, а также порядок выполнения вызовов «Успех / ошибка / завершение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...