i want create common message box method can called throughout asp.net 5
application
the code should this:
public class webhelper { public static iactionresult messagebox(string message) { return partialview("~/views/shared/_messagebox.cshtml", message); } }
and in controller call:
return webhelper.messagebox("hallo world");
instead of doing of :
return partialview("~/views/shared/_messagebox.cshtml", "hallo world");
however partialview bound controller seems cannot use outside controller.
i tried use answers 1 answers 2 solutions asp.net 4
don't work in asp.net 5
e.g.
public string renderpartialviewtostring(string viewname, object model) { this.viewdata.model = model; try { using (stringwriter sw = new stringwriter()) { viewengineresult viewresult = viewengines.engines.findpartialview(this.controllercontext, viewname); viewcontext viewcontext = new viewcontext(this.controllercontext, viewresult.view, this.viewdata, this.tempdata, sw); viewresult.view.render(viewcontext, sw); return sw.getstringbuilder().tostring(); } } catch (system.exception ex) { return ex.tostring(); } }
as can't find viewengines.engine
in asp.net 5
namespaces.
question: simplest way solve problem in `asp.net 5? providing method , calling method code
here's helper class renders view: (as can see, viewengines.engine
part couldn't find anymore injected irazorviewengine
)
using system; using system.io; using microsoft.aspnet.http.internal; using microsoft.aspnet.mvc; using microsoft.aspnet.mvc.abstractions; using microsoft.aspnet.mvc.modelbinding; using microsoft.aspnet.mvc.razor; using microsoft.aspnet.mvc.rendering; using microsoft.aspnet.mvc.viewfeatures; using microsoft.aspnet.routing; namespace webapp.demo.helpers { public class razorviewtostringrenderer { private irazorviewengine _viewengine; private itempdataprovider _tempdataprovider; private iserviceprovider _serviceprovider; public razorviewtostringrenderer( irazorviewengine viewengine, itempdataprovider tempdataprovider, iserviceprovider serviceprovider) { _viewengine = viewengine; _tempdataprovider = tempdataprovider; _serviceprovider = serviceprovider; } public string renderviewtostring<tmodel>(string name, tmodel model) { var actioncontext = getactioncontext(); var viewengineresult = _viewengine.findview(actioncontext, name); if (!viewengineresult.success) { throw new invalidoperationexception(string.format("couldn't find view '{0}'", name)); } var httpcontextaccessor = new httpcontextaccessor(); httpcontextaccessor.httpcontext = actioncontext.httpcontext; var view = viewengineresult.view; using (var output = new stringwriter()) { var viewcontext = new viewcontext( actioncontext, view, new viewdatadictionary<tmodel>( metadataprovider: new emptymodelmetadataprovider(), modelstate: new modelstatedictionary()) { model = model }, new tempdatadictionary( httpcontextaccessor, _tempdataprovider), output, new htmlhelperoptions()); view.renderasync(viewcontext).getawaiter().getresult(); return output.tostring(); } } private actioncontext getactioncontext() { var httpcontext = new defaulthttpcontext(); httpcontext.requestservices = _serviceprovider; return new actioncontext(httpcontext, new routedata(), new actiondescriptor()); } } }
in startup.cs
:
public void configureservices(iservicecollection services) { // add mvc services services container. services.addmvc(); // add helper rendering class singleton services.addsingleton<razorviewtostringrenderer>(); }
get injected helper class in controller example:
public homecontroller(razorviewtostringrenderer renderer) { string message = "hallo world"; var partialview = renderer.renderviewtostring("~/views/shared/_messagebox.cshtml", message); }
code here, few tweaks work old packages "microsoft.aspnet.mvc": "6.0.0-rc1-final"
: https://github.com/aspnet/entropy/tree/dev/samples/mvc.renderviewtostring
if you're using new "microsoft.aspnetcore.mvc": "1.0.0-*"
, code there
Comments
Post a Comment