1

我想知道是否可以将 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 表达式吗?

4

1 回答 1

2

这个问题似乎与您的相似: 在 JSON 结果中定义函数是否有效?

简而言之:不,您只能回发标准类型。

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

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

于 2013-02-01T22:47:16.693 回答