微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

剃刀 – Asp.net Core如何呈现视图

MVC 6如何呈现视图. Razor ViewEngine中生成html输出的实际方法是什么?如果可能的话,请解释渲染视图的过程.

也许你可以指点我在github上的mvc源文件.谢谢!

@H_404_10@解决方法
这是您正在寻找的完整解决方案.我使用依赖注入来获取控制器中的 HtmlHelper.如果你愿意的话,你可以注入自己的助手.

using Microsoft.AspNet.Html.Abstractions;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.AspNet.Mvc.ViewFeatures.Internal;
using Microsoft.Extensions.WebEncoders;
using System.ComponentModel.DataAnnotations;
using System;

 public class MyController : Controller
 {
    private readonly IHtmlGenerator htmlGenerator;
    ICompositeViewEngine viewEngine;
    IModelMetadataProvider MetadataProvider;
    private readonly IHtmlHelper helper;
    IHtmlEncoder htmlEncoder;
    IUrlEncoder urlEncoder;
    IJavaScriptStringEncoder javaScriptStringEncoder;

    public MyController(IHtmlHelper helper,IHtmlGenerator htmlGenerator,ICompositeViewEngine viewEngine,IModelMetadataProvider MetadataProvider,IHtmlEncoder htmlEncoder,IUrlEncoder urlEncoder,IJavaScriptStringEncoder javaScriptStringEncoder)
    {

        this.htmlGenerator = htmlGenerator;
        this.viewEngine = viewEngine;
        this.MetadataProvider = MetadataProvider;
        this.htmlEncoder = htmlEncoder;
        this.urlEncoder = urlEncoder;
        this.javaScriptStringEncoder = javaScriptStringEncoder;
        this.helper = helper;
    }

    [HttpGet]
    public IActionResult MyHtmlGenerator()
    {
        Myviewmodel temp = new Myviewmodel();


        var options = new HtmlHelperOptions();
        options.ClientValidationEnabled = true;

        ViewDataDictionary<Myviewmodel> dic = new ViewDataDictionary<Myviewmodel>(this.MetadataProvider,new ModelStateDictionary());

        ViewContext cc = new ViewContext(ActionContext,new FakeView(),dic,TempData,TextWriter.Null,options);

        var type = typeof(Myviewmodel);
        var Metadata = this.MetadataProvider.GetMetadataForType(type);


        ModelExplorer modelEx = new ModelExplorer(this.MetadataProvider,Metadata,temp);
        ViewData["Description"] = "test desc";
        ViewData["Id"] = 1;

        this.ViewData = new ViewDataDictionary(this.MetadataProvider,new ModelStateDictionary());

        IHtmlHelper<Myviewmodel> dd = new HtmlHelper<Myviewmodel>(this.htmlGenerator,this.viewEngine,this.MetadataProvider,this.htmlEncoder,this.urlEncoder,this.javaScriptStringEncoder);
        ((ICanHasViewContext)dd).Contextualize(cc);
        dd.ViewContext.ViewData = this.ViewData;

        var desc = GetString(dd.TextBoxFor(m => m.ID));
        var ID = GetString(dd.TextBoxFor(m => m.Description));

        // Do whatever you want with the ID and desc

        return new ContentResult() { Content = ID + desc };

    }

    public static string GetString(IHtmlContent content)
    {
        var writer = new System.IO.StringWriter();
        content.Writeto(writer,new HtmlEncoder());
        return writer.ToString();
    }
}


public class Myviewmodel : BaseAssetviewmodel
{
    //  [RegularExpression(@"^-?\d{1,13}(\.\d{0,5})?$|^-?\.\d{1,5}$")]
    [required]
    public int ID { get; set; }

    [MinLength(2)]
    public string Description { get; set; }

    // Property with no validation
    public string Other { get; set; }
}


public class FakeView : IView
{
    string IView.Path
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    public Task RenderAsync(ViewContext viewContext)
    {
        throw new InvalidOperationException();
    }

    Task IView.RenderAsync(ViewContext context)
    {
        throw new NotImplementedException();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐