За кулисами компилятор генерирует класс, который представляет собой замыкание для вызова метода. Он использует этот единственный экземпляр класса закрытия для каждой итерации цикла. Код выглядит примерно так: это облегчает просмотр ошибки:
void Main()
{
List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
var closure = new CompilerGeneratedClosure();
Func<int> anonymousMethodAction = null;
while (closure.variable < 5)
{
if(anonymousMethodAction == null)
anonymousMethodAction = new Func<int>(closure.YourAnonymousMethod);
//we're re-adding the same function
actions.Add(anonymousMethodAction);
++closure.variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
}
class CompilerGeneratedClosure
{
public int variable;
public int YourAnonymousMethod()
{
return this.variable * 2;
}
}
На самом деле это не скомпилированный код из вашего примера, но я изучил свой собственный код и этот очень похоже на то, что на самом деле генерирует компилятор.
Проблема с этим кодом
$('#SIId').change(function () {
$('.addQty').click(function () {
$.post("@Url.Action("AddQuantity", "PurchaseOrder")", { id: $(this).data('posid'), Qty: $('#qty').val(), Siid: $("select option:selected").val() })
});
});
Здесь вы регистрируете событие click
для кнопки на событии onChange
в DropDownList
, что нормально, но это не так triggers
click
событие этого button
и, следовательно, никакого вызова post
не происходит, вам нужно click
на button
выполнить вызов post
. кроме того, что все выглядит хорошо, я попробовал это, и он публикует данные.
Надеюсь, это поможет, или дайте мне знать, если я что-то здесь упустил ... Удачного кодирования ...