使用ajax将lambda表达式传递给控制器

时间:2012-06-06 15:24:08

标签: jquery asp.net ajax json lambda

我想知道是否可以将视图中的lambda表达式传递回控制器 例如,我有一个模型:

public class ExpressionModel<T>
{
    public Expression<Func<T, string>> Expression { get; set; }
}

将模型传递给视图的控制器如下所示:

public ViewResult Index()
{
    var expressionModel =  new ExpressionModel<SomeClass>();
    expressionModel.Expression = r => r.SomeStringProperty;

    return View(expressionModel);
}

现在视图有一个模型:

@model ExpressionModel

现在使用Ajax我想将模型传回控制器

var model = @Html.Raw(Json.Encode(Model));

$.ajax({ url: "@someControllerUrl",  
    type: 'POST',
    data: JSON.stringify(model),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.success);
    },
    error: function () {
        alert("error");
    }
 });

从视图中获取表达式模型的控制器方法看起来像这样

[HttpPost]
public ViewResult Index(ExpressionModel expressionModel)
{
    return View();
}

使用ajax甚至可以吗?或者你只能回发标准类型,如int,string,bool(或列表中或其他类内的任何组合)? 如果不可能的话,我可以将某个字符串转换为lambda表达式吗?

1 个答案:

答案 0 :(得分:2)

这个问题与您的问题类似: Is it valid to define functions in JSON results?

简而言之:不,你只能回复标准类型。

最后: AJAX只是通过Javascript以异步方式将HTTP数据传回服务器。这些数据可以是您喜欢的任何数据。然后服务器必须决定如何解析该数据。将用户输入(来自客户端的任何应该被视为用户输入)转换为lambda表达式是一个坏主意。它将允许用户在您的服务器上执行任意代码

应该做的是创建服务器端的有效lambda表达式列表,然后传回与您要使用的lambda对应的索引。这样,您就可以完全控制在服务器上运行的代码。或者,除此之外,使用一些简单的输入解析来构造字符串中的lambda。但要非常小心,因为以这种方式创建安全漏洞非常容易。