Saya baru mengenal Razor Engine, hanya punya pertanyaan tentang menghasilkan respons di ASP.NET MVC

Pertama, kita tahu bahwa peran mesin tampilan adalah menerjemahkan permintaan tampilan ke objek ViewEngineResult, dan mesin tampilan Razor mengimplementasikan IViewEngine

public interface IViewEngine
{
   ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage);
   ViewEngineResult GetView(string executingFilePath, string viewPath, bool isMainPage);

}

Dan dalam metode FindView atau GetView, mesin Razor mengembalikan objek ViewEngineResult sebagai:

// pseudo code for simplification
if view_found 
   return ViewEngineResult.Found(viewName, new RazorView(...));

RazorView mengimplementasikan IView sebagai:

public class RazorView : IView
{
   public string Path { get; }
   public virtual Task RenderAsync(ViewContext context);
}

Dan fungsi RenderAsync tampaknya menjadi orang yang menghasilkan respons.

Tetapi file .cshtml juga dikompilasi ke dalam kelas C# oleh mesin Razor, di bawah ini adalah n contoh kode C# yang dihasilkan dari index.cshtml:

public class ASPV_Views_Home_Index_cshtml : RazorPage<string[]> {
   ...
   public override async Task ExecuteAsync() {
      ...//this method also seems to generate response
   }
}

Jadi ExecuteAsync juga tampaknya menghasilkan respons

Terakhir, jika kita melihat objek ViewResult yang dikembalikan oleh metode tindakan, ViewResult mengimplementasikan ActionResult(menerapkan IActionResult) sebagai

public class ViewResult : ActionResult
{
  ...
  public override Task ExecuteResultAsync(ActionContext context); 
}

ExecuteResultAsync juga tampaknya menghasilkan respons.

Jadi kami memiliki tiga kandidat

1-RazorView.RenderAsync()

2-RazorPage.ExecuteAsync()

3-ViewResult.ExecuteResultAsync()

Mana yang asli yang menghasilkan respon?

0
secondimage 7 Agustus 2019, 10:50

1 menjawab

Jawaban Terbaik

ExecuteResultAsync ditangani secara berbeda berdasarkan jenis hasil (ViewResult, PageResult, ContentResult, JsonResult, dll.). Dalam kasus ViewResult, tanggung jawab utamanya adalah menyetel properti objek HttpResponse ( StatusCode, ContentType, Body, dll.).

Secara internal ExecuteResultAsync memanggil RenderAsync yang bertanggung jawab untuk merender tampilan dan tata letaknya.

Sekali lagi, secara internal RenderAsync memanggil ExecuteAsync. ExecuteAsync adalah apa yang melakukan rendering sebenarnya dari sintaks silet.

Anda dapat mengunduh repositori .NET Core AspNetCore dan memeriksa detail tentang bagaimana semuanya terhubung -di bawah Microsoft.AspNetCore.Mvc namespace-.

3
rhytonix 7 Agustus 2019, 23:51