簡體   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