【问题标题】:Execute a C# Lambda expression inside a Javascript function with Parameter在带有参数的 Javascript 函数中执行 C# Lambda 表达式
【发布时间】:2019-09-03 14:54:49
【问题描述】:

我在 ASP.NET MVC Web 应用程序的视图内有一个 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

    }

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

如果我在 lambda 表达式中对数据进行硬编码,那么它就可以工作。但是如何让它从javascript方法签名中读取参数呢?

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

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

【问题讨论】:

  • @Model.Where(i =&gt; i.EmpID == ParameterEmpID).Select(c =&gt; c.ExistingLeaveString).FirstOrDefault(); 的结果是什么样的..?
  • 只是一个字符串。它看起来像“此用户之前申请过休假”。
  • 你的输出是什么?您的 html 页面看起来如何(尤其是脚本部分)?我认为 C# 只会在源 ant 中写入对象的类型,这不是 javascript 的可处理格式。
  • 那你需要引用它:var selecteddates = "@Model.Where(i =&gt; i.EmpID == ParameterEmpID).Select(c =&gt; c.ExistingLeaveString).FirstOrDefault();"
  • @Stuart 如果我在 lambda 表达式中对 ParameterEmpID 进行硬编码,它就可以工作。但它不接受函数签名中的参数。

标签: javascript c# razor


【解决方案1】:

你有两个问题:

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

你有这个:

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

假设Model.Where(i =&gt; i.EmpID == ParameterEmpID).Select(c =&gt; 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 在他的评论中有错字)

第二个问题是您混合了服务器端和客户端代码。 Razor 表达式在服务器端进行评估。 JavaScript 在客户端进行评估。因此,您不能像尝试使用 .Where(i =&gt; 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 请求,您可以在其中再次验证他们是谁并返回数据。

【讨论】:

    【解决方案2】:

    使用@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
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多