2015-01-12 17 views
6

MVC 6 nasıl bir görünüm oluşturur. Razor ViewEngine'de html çıktısını üreten gerçek yöntem nedir? Ayrıca mümkünse lütfen bir görünüm oluşturma sürecini açıklayın.Asp.net Core görünümü nasıl oluşturur?

github üzerinde mvc kaynağına bir dosyaya beni noktası olabilir olabilir. Teşekkürler! onlar farklı bir şekilde çalışıyoruz

https://github.com/DamianEdwards/TagHelperStarterWeb

entegre yardımcıları oluşturmak için:

+0

bu cevaplamak için biraz geniş, ama temelde ViewResult ('Görünüm return()') on-the-fly C# derleyicisi kullanılarak uygun görünümü derler. Bunun kaynağın kendisi dışında herhangi bir yerde belgelenmiş olduğunu sanmıyorum. Kaynak ağacını indirip neyi aradığınızı neyi engelliyorsunuz? Tam olarak ne yapmaya çalışıyorsun, neden bilmek istiyorsun? – CodeCaster

+0

Kendi htmlHelper'ımı kod aracılığıyla anında oluşturmaya ve sağlanan modele bağlı olarak görünümü göstermeye çalışıyorum. Kaynak koduna da bakıyorum ama belgelemesiz bulmak zor görünüyor. – eadam

+0

Bu amaç biraz geriye doğru geliyor. Elbette kontrolör karar verebilirdi. Kısmi görüşler mi demek istiyorsun? –

cevap

2

İşte aradığınızı tam bir çözüm. HtmlHelper'ı denetleyicide almak için bağımlılık enjeksiyonunu kullandım. İsterseniz kendi yardımcınızı da enjekte edebilirsiniz. Korkarım

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(); 
    } 
} 
0

bu yardımcı olabilir eğer bilmiyorum, etiket yardımcıları bakmak başlamak zorunda olabilir sayfada daha doğal bir şekilde.

İlgili konular