如何在 .Net Core 应用程序中使用模型呈现 Razor 页面并使用 HttpClient 发送它

How to render Razor Page with a model in .Net Core app and send it with HttpClient

我正在开发服务,它正在生成与模型连接的动态 Razor page,页面需要通过 HttpClient 发送到另一个服务。 这是正在生成视图的 ActionResult

// GET: /Details/
public async Task<IActionResult> DetailsSend(int id)
{
    if (id == null)
    {
        return NotFound();
    }
    
    var details = await _context.Details
        .FirstOrDefaultAsync(d=> d.Id == id);

    return View(details);
}

但我不想 return 这个视图(详细信息)。我想通过 httpclient 发送这个动态视图。有什么建议吗?

你应该这样写:

 var details = (await context (d => d.Id == id)).Details.FirstOrDefaultAsync();

您可以将视图呈现为字符串,如下所示:

public class EmployeesController : Controller
{
    private readonly YourDbContext _context;
    private readonly Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine _viewEngine;

    public EmployeesController(ICompositeViewEngine viewEngine, YourDbContext context)
    {
        _viewEngine = viewEngine;
        _context = context;
    }
    public async Task<string> DetailsSend(int id)
    {
        var details = await _context.Details
            .FirstOrDefaultAsync(d => d.Id == id);
        string view = "";
        ViewData.Model = details;
        using (var writer = new StringWriter())
        {
            ViewEngineResult viewResult = _viewEngine.FindView(ControllerContext, "Details", false);
            ViewContext viewContext = new ViewContext(
                                                        ControllerContext,
                                                        viewResult.View,
                                                        ViewData,
                                                        TempData,
                                                        writer,
                                                        new HtmlHelperOptions()
                                                        );

            await viewResult.View.RenderAsync(viewContext);
            view = writer.GetStringBuilder().ToString();
        }

        return view;
    }
}

然后你可以使用 HttpClient 调用它 api 并得到如下结果:

public async Task<IActionResult> Index()
{
    var url = "https://localhost:portNumber/ControllerName/detailssend/1";//it should be the url of your api
    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(url);
    using (var content = response.Content)
    {
        //get the json result from your api
        var result = await content.ReadAsStringAsync();
    }
}