ASP.NET MVC Razor - 将数据发送到控制器

Sco*_*erg 3 ajax asp.net-mvc jquery razor

有各种各样的帖子关于从表单/ 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 );
        }   
    });
}
Run Code Online (Sandbox Code Playgroud)

控制器的外观如下:

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

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);
        }   
    });
}
Run Code Online (Sandbox Code Playgroud)

控制器的外观如下:

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

这不是将数据移动到服务器的坏方法,但它很容易受到剃刀标记的影响而导致控制器爆炸.我知道你永远不会摆脱这个问题,但减少可能性是一个想法.

将屏幕数据传送到服务器端控制器的最佳方法是什么?

Raf*_*fay 8

如果你使用强类型视图,那么你所要做的就是

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

和控制器看起来像

[HttpPost]
public JsonResult SendEMail( CNameValue model )
{
    String prop = model.YourModelProperty; 
Run Code Online (Sandbox Code Playgroud)

你也可以使用表单集合

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

和控制器看起来像

[HttpPost]
public JsonResult SendEMail( FormCollection col )
{
    String prop = col.Get("FormFieldName"); 
Run Code Online (Sandbox Code Playgroud)