Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

216
Visualizações
Cómo pasar DotNetObjectReference a JS DOM-event

Estoy tratando de utilizar JS arrastrar y soltar en Blazor, que funciona bien en general, pero quiero configurar una imagen de arrastre personalizada durante el evento ondragstart . En general, mi código se ve así:

 <div class="some-draggable-container" draggable="true" ondragstart="Element.dragStartHandler(event, '@(ImageSrcBase64)')" > </div>
 Element.dragStartHandler = function(event, imgSrcBase64) { var img = new Image(); img.src = imgSrcBase64; event.dataTransfer.setDragImage(img, 0, 0); }

El problema que se me ocurre es que necesito llamar a una función .Net después de configurar la imagen de arrastre y no puedo encontrar una manera de pasar la DotNetObjectReference necesaria a través de la parte JS.

Simplemente pasar el objectRef recién creado a la llamada de evento JS conduce a un Unexpected end of input .

 ondragstart="Element.dragStartHandler(event, '@(ImageSrcBase64)', @(DotNetObjectReference.Create(this)))"

Además, usar JsonSerializer no funciona. Seguramente serializa el objeto y JS puede deserializarlo, pero como era de esperar, los métodos DotNet.invokeMethod() no están presentes.

 ondragstart="Element.dragStartHandler(event, '@(ImageSrcBase64)', @(JsonSerializer.Serialize(DotNetObjectReference.Create(this))))"

Utilizar el evento Blazor y manejarlo completamente en .Net no ofrece la posibilidad de configurar la imagen de arrastre porque los DragEventArgs pasados no son totalmente compatibles con el de JS.

Pasar los argumentos del evento a través IJSRuntime a una función JS genera errores porque simplemente no es lo mismo que el evento JS nativo, por lo que al menos falta el método setDragImage() .

¿Hay alguna manera de hacer funcionar esto? No quiero hacer malabares con JS-to-static-.Net llamadas y guids o ese tipo de solución.


Editar
Como @MisterMagoo mencionó en un comentario ahora eliminado: sería una forma suficiente de pasar DotNetObjectReference durante el primer ciclo de OnAfterRender a la parte JS, así como un guid estático y referenciarlo más tarde si es necesario.

El problema con eso es que, en mi caso, la lista puede tener fácilmente entre 50 y 100 entradas y no sé cómo afectaría esto al rendimiento y la memoria. Entonces, en casos pequeños, esto estaría bien, pero en mi caso probablemente no.


Editar
Entonces, para aclarar la razón por la que elegí resolver este problema en primer lugar: sé que podría resolver este problema puramente en Blazor simplemente creando una imagen que sigue al cursor. Pero a través de JS ya existe una forma de configurar la imagen de arrastre que maneja el propio navegador en términos de posicionamiento y movimiento de la imagen. Así que quería ir por la ruta más eficiente en cuanto al rendimiento en lugar de utilizar completamente Blazor porque tenemos una ventana de rendimiento estrecha para nuestra aplicación.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

esto es solo un psuedo código incorrecto que estoy escribiendo en el bloc de notas desde la memoria y el código apunta en un bucle, pero debería darle una idea de cómo llamar a javascript y luego enviar los datos a C #

en un archivo js:

 window.myBlazor = { doSomething: function(cSharpObjectReference, val1, val2)  // some js stuff happens cSharpObjectReference.Notify(someData)}; 

en un archivo cs:

 public static class MyInterops { private static readonly string _BaseObjectContainer = "myBlazor"; public static async Task DoSomethingCs(IJSRuntime jsRuntime, ObjectJavaScriptShouldUse cSharp, MyModel model) { await jsRuntime.InvokeVoidAsync($"{_BaseObjectContainer}.doSomething", DotNetObjectReference.Create(cSharp), model.Val1, model.Val2); } } public class ObjectJavaScriptShouldUse { private readonly IJSRuntime _jsRuntime; [JSInvokable] public async ValueTask Notify(MouseEvent eventArgs) { await MyInterops.DoSomethingCs(_jsRuntime, this, eventArgs); //i accidentally pointed these calls in recursion, but you get the idea } }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda