Calling .NET Function from Javascript File in Blazor Server

37 Views Asked by At

I am trying to add dynamically a div element inside my parent div in blazer application. There is a button also in that div which works fine for all those elements which were rendered at the time of page loading. But for Dynamically added Div they are not working. It's because we can't call directly .NET Method from a button using JavaScript. So, I search all over the internet found some solutions but none of them are working. Here is my code for that div to add dynamically.

private async Task AddDivtoTheBoard(VwTicketsAssignList card)
    {
        var TicketName = "";
        if(card.TicketName.Length > 50)
        {
            TicketName = card.TicketName.Substring(0, 50)+"...";
        }
        else
        {
            TicketName = card.TicketName;
        }

        var Description = "";
        if (card.TicketName.Length > 50)
        {
            Description = card.Description.Substring(0, 50) + "...";
        }
        else
        {
            Description = card.Description;
        }
        string htmlContent = @"
        <div class='kanban-item' style='border-top:5px solid '"+card.StatusColor+";' id='Board_" +Convert.ToString(card.TicketId) + @"' draggable='true' ondragstart='drag(event)'>
            <div class='kanban-item-title'>
                <RadzenImage Path='"+card.ProfileImage+@"' class='rounded-circle float-start me-3' Style='width: 40px; height: 40px;' />
                <h6 class='title'> Ticket # "+card.TicketNo+@"</h6>
            </div>
            <div class='kanban-item-title'>
                <h6 class='title'>
                        " + TicketName + @"
                </h6>
            </div>
            <div class='kanban-item-text'>
                <p> 
                        " + Description+ @"

                </p>
                <ul class='kanban-item-tags'>
                    <li><span class='badge "+card.TypeIcon+"' style='color:white;font-family:Calibri;'>"+card.TypeName+@"</span></li>
                </ul>
                <div class='kanban-item-meta'>
                    <ul class='kanban-item-meta-list'>
                        <li class='text-danger'><span>"+card.TimeLine?.ToString("dd-MMM-yyyy")+@"</span></li>
                        <li><em class='icon ni ni-notes'></em><span>"+card.StaffName+@"</span></li>
                    </ul>
                    <ul class='kanban-item-meta-list'>
                        <li><em class='icon ni ni-clip'></em><span></span></li>
                        <li><em class='icon ni ni-comments'></em><span></span></li>
                    </ul>
                </div>
                <div class='btn-group'>
                     <button class='kanban-add-task btn btn-block'  onclick='callShowAssignToComponentByID(" + card.TicketId + @")'>Actions </button>
                </div>
            </div>
        </div>
    ";
        var StageID = "Stage_"+Convert.ToString(GetStageIDForTickets(card));
        var script = $"addDivToTopOfStage('{StageID}', `{htmlContent}`);";
        await _JsRuntime.InvokeVoidAsync("eval", script);

    }

Div got added on the page but button function onclick is not working I tried using JSInvokable attribute but got no luck here is the JSInvokable Method

[JSInvokable("ShowAssignToComponentByID")]
    public  async Task ShowAssignToComponentByID(string _ticketID)
    {
        int ticketID = Convert.ToInt32(_ticketID);
        SelectedTicket =  _VwAssignedTicketsList.Where(ticket => ticket.TicketId != ticketID).FirstOrDefault() ;
        _ShowAssignToComponent = true;
        StateHasChanged();
    }

and here is my Javascript code to call this Method

let JsRuntime; // Global variable to store the IJSRuntime

function setJSRuntime(runtime) {
    JsRuntime = runtime;
}

window.callShowAssignToComponentByID = function (ticketID) {
    JsRuntime.invokeMethodAsync('SagErpBlazor','SagErpBlazor.AdminDashboardNew.ShowAssignToComponentByID', ticketID.toString());
};

Please help me to sort out this issue where I am wrong?

0

There are 0 best solutions below