繁体   English   中英

使用参数在Javascript函数中执行C#Lambda表达式

[英]Execute a C# Lambda expression inside a Javascript function with Parameter

我在ASP.NET MVC Web应用程序的View中有一个Javascript函数。

在我的页面中传递的模型是一个列表。

@model IEnumerable<DeliveryDashboard.Models.LeaveDetailsModel>

Javascript函数如下所示:

function ShowLeavePopup(ParameterEmpID) {

        var selecteddates = @Model.Where(i => i.EmpID == ParameterEmpID).Select(c => c.ExistingLeaveString).FirstOrDefault();
        alert(selecteddates);

        // do stuff with the selecteddates

    }

此代码不起作用。 我试图检索的model属性是一个简单的字符串数据。

如果我对lambda表达式中的数据进行硬编码,那么它将起作用。 但是,如何使其从javascript方法签名中读取参数?

var selecteddates = "@Model.Where(i => i.EmpID == 112233).Select(c => c.ExistingLeaveString).FirstOrDefault();
        alert(selecteddates)"

我总是可以进行Ajax调用并将其回发到服务器以从数据库中获取数据。 但是,由于我所需的数据已经在“模型列表”中提供了,是否有可能以某种方式从模型本身中提取数据?

您有两个问题:

如果您在浏览器中查看生成的代码,则应该能够看到的第一个问题 请记住,在JavaScript中使用C#代码只会输出该值。 它不会包含您需要的任何JavaScript语法。

你有这个:

var selecteddates = @Model.Where(i => i.EmpID == ParameterEmpID).Select(c => c.ExistingLeaveString).FirstOrDefault();

假设Model.Where(i => i.EmpID == ParameterEmpID).Select(c => c.ExistingLeaveString).FirstOrDefault()返回Some String 生成的JavaScript代码最终将是:

var selecteddates = Some String;

那不是有效的JavaScript。 您需要在JavaScript需要它们的地方明确地加上引号:

var selecteddates = "@Model.Where(i => i.EmpID == ParameterEmpID).Select(c => c.ExistingLeaveString).FirstOrDefault()";

(请注意,引号应在分号之前-Stuart的注释中有错字)

第二个问题是您正在混合服务器端和客户端代码。 剃刀表达式在服务器端评估。 JavaScript是在客户端评估的。 因此,您不能像在尝试使用.Where(i => i.EmpID == ParameterEmpID)那样在Razor表达式中使用JavaScript变量,因为在服务器上评估了Where

您将必须找出一种不同的方式来做到这一点。 您可以想到两种选择:

  1. 将整个列表存储在JavaScript中,如下所示:
var empLeaves = @JsonConvert.SerializeObject(Model.Select(e => new {e.EmpID, e.ExistingLeaveString}));

然后更改ShowLeavePopup函数,以在empLeaves列表中搜索具有正确empId 但是请记住,查看该页面的任何人都可以按F12键,并查看员工ID列表以及您的“离开字符串”是什么,这可能是也可能不是允许用户查看的机密信息。

  1. 另一个选择是让ShowLeavePopup使用EmpID向服务器发出AJAX请求,您可以在其中验证他们又是谁并返回数据。

使用@ Html.Raw()

function ShowLeavePopup(ParameterEmpID) {

    var selecteddates = @Html.Raw(@Model.Where(i => i.EmpID == ParameterEmpID).Select(c => c.ExistingLeaveString).FirstOrDefault());
    alert(selecteddates);

    // do stuff with the selecteddates

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM