我想知道是否可以将视图中的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表达式吗?
答案 0 :(得分:2)
这个问题与您的问题类似: Is it valid to define functions in JSON results?
简而言之:不,你只能回复标准类型。
最后: AJAX只是通过Javascript以异步方式将HTTP数据传回服务器。这些数据可以是您喜欢的任何数据。然后服务器必须决定如何解析该数据。将用户输入(来自客户端的任何应该被视为用户输入)转换为lambda表达式是一个坏主意。它将允许用户在您的服务器上执行任意代码
应该做的是创建服务器端的有效lambda表达式列表,然后传回与您要使用的lambda对应的索引。这样,您就可以完全控制在服务器上运行的代码。或者,除此之外,使用一些简单的输入解析来构造字符串中的lambda。但要非常小心,因为以这种方式创建安全漏洞非常容易。