@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] 举报,一经查实,本站将立刻删除。