यहां आप जो खोज रहे हैं उसका पूरा समाधान यहां है। मैंने नियंत्रक में 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();
}
}
स्रोत
2016-01-22 21:07:15
मुझे डर लग रहा यह कुछ अधिक जवाब देने के लिए व्यापक है, लेकिन मूल रूप से एक ViewResult ('लौट देखें()') ऑन-द-मक्खी सी # संकलक का उपयोग कर उचित दृश्य संकलित करता है। मुझे नहीं लगता कि यह स्रोत में छोड़कर कहीं भी दस्तावेज है। स्रोत पेड़ को डाउनलोड करने और आप जो खोज रहे हैं उसे ढूंढने से आपको क्या रोकता है? आप वास्तव में क्या करने की कोशिश कर रहे हैं, आप क्यों जानना चाहते हैं? – CodeCaster
मैं कोड के माध्यम से फ्लाई पर अपना स्वयं का एचटीएमएल हेल्पर बनाने की कोशिश कर रहा हूं और फिर आपूर्ति किए गए मॉडल के आधार पर दृश्य प्रस्तुत करता हूं। मैं स्रोत कोड को भी देख रहा हूं लेकिन दस्तावेज़ीकरण के बिना खोजने में थोड़ा मुश्किल लगता है। – eadam
वह लक्ष्य थोड़ा पीछे की ओर लगता है। निश्चित रूप से नियंत्रक निर्णय ले सकता/सकती है। क्या आप वास्तव में आंशिक विचारों का मतलब है? –