1

我在 MVC 网站项目中使用 jquery。

我有一个名为“testController”的简单 C# 控制器:

public class testController
{
    public string test(string id)
    {
        return id;
    }
}

..和一个使用它的javascript函数:

function myfunct(sData) {
    $.ajax({
        type: "POST",
        async: false,
        datatype: "json",
        url: '/test/test',
        data: '{' + sData + '}', //Not Working if I set sData = "id:'Hello'"
                                 //Work if I write data = { id:'hello'},
        success: function (json) {
            alert(json); //Need to return 'Hello'
        }
    });
}

..有一种方法可以动态分配“数据”参数吗?

4

6 回答 6

4

只要您传递的对象中的属性与操作接受的类型的属性相匹配,您就可以根据需要创建对象。尝试这个:

var sData = { id: 1234 }; // note 'id' matches the property in the signature of the action method

// in the $.ajax() call properties...
data: sData

这也适用于类。例如,如果您的控制器中有此类和操作:

public class Foo {
    public int Id { get; set; }
    public string Name { get; set; }
}

// in controller:
public ActionResult Bar(Foo myFoo) {
    // do stuff with Foo
}

然后,您可以通过$.ajax以下形式传递一个 javascript 对象:

var data = { Id: 1234, Name: 'Foo bar' };

请注意,属性被映射到方法签名中的类的属性。

于 2013-01-14T10:46:49.770 回答
2

如果 thekey和 itsvalue都是动态的,则需要使用稍微不同的语法来创建data在调用 时设置为属性的对象jQuery.ajax()

一般原则是这样的:

var key = 'id', value = 'Hello', data = {};
data[key] = value;

这是因为在 JavaScript 中对象键(或属性)不必是字符串。以下是完全有效和等效的:

var obj = {id : 'Hello'};
var obj = {'id' : 'Hello'};

因此,如果您尝试使用存储在变量中的动态值,并在尝试创建它时将其传递给对象字面量,JavaScript不知道它应该使用具有该名称的变量的值,而是只是将其视为对象中的关键。

在您的情况下,您可能想要更改函数,以便将对象本身传递给它,如下所示:

function myfunct(sData) {
    $.ajax({
        type: "POST",
        async: false,
        datatype: "json",
        url: '/test/test',
        data: sData,
        success: function (json) {
            alert(json); //Need to return 'Hello'
        }
    });
}

然后像这样使用它:

var key = 'id', value = 'Hello', data = {};
data[key] = value;
myfunct(data);

至于为什么data: '{' + sData + '}'不起作用,当您将字符串作为data属性值传递时,jQuery 只是将其用作 AJAX 请求的查询字符串,而您传递的字符串不会设置正确的参数。

于 2013-01-14T11:03:48.167 回答
0

我找到了一个解决方案:

正如@Anthony Grist 在之前的回答中提到的那样,我需要使用一个对象,而不是一个字符串......所以使用 '. eval()' 方法我动态创建我的键值对。

像这样的东西:

function myfunct(sData) {
eval('var ssData = {' + sData + '}');
$.ajax({
    type: "POST",
    async: false,
    datatype: "json",
    url: '/test/test',
    data: ssData,
    success: function (json) {
        alert(json); 
    }
});
}
myfunct("id:'hello'"); //Return Hello
myfunct("id:'bye'"); //Return bye

...这似乎对我有用..你怎么看?

于 2013-01-14T11:21:54.497 回答
0

您可以创建一个单独的变量以将参数发送到控制器中的操作。

function myfunct(sData) {
    $.ajax({
        type: "POST",
        async: false,
        datatype: "json",
        url: '/test/test',
        data: { id: 'hello'}, // pass directly your parameter in a dynamic object
        success: function (json) {
            // your can read: json.Id , json.Name, etc...
            alert(json.id); //Need to return 'Hello' in ID property
        }
    });
}

在控制器上,您可以获取字符串并返回 JSon 格式的结果。

public class TestController
{
    public ActionResult Test(string id)
    {
        string valueResult = id; // process your result
        return Json(new { id: valueResult, name = 'User' }, JsonRequestBehavior.AllowGet.);
    }
}
于 2013-01-14T10:48:46.887 回答
0

尝试以下

var mydata = { key : value };

    $.ajax({
        type: "POST",
        async: false,
        datatype: "json",
        url: '/test/test',
        data: mydata,
        success: function (json) {
            alert(json); //Need to return 'Hello'
        }
    });
于 2013-01-14T10:49:14.440 回答
0

可能你正在寻找这个:

jQuery.parseJSON()在您的情况下会有所帮助:http ://api.jquery.com/jQuery.parseJSON/

function myfunct(sData) {

    $.ajax({
        type: "POST",
        async: false,
        datatype: "json",
        url: '/test/test',
        data: jQuery.parseJSON(sdata),
        success: function (json) {
            alert(json); //Need to return 'Hello'
        }
    });
}
于 2013-01-14T11:00:59.950 回答