কেউ কীভাবে কোনও অ্যাকশনের অভ্যন্তরে কোনও ভিউ তৈরির এইচটিএমএল পাবেন কীভাবে জানেন?
এটি কি এমন কিছু:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
উত্তর:
আমি ক্লাসে স্থিতিশীল পদ্ধতি ব্যবহার করি Utilities.Commonআমি কল করেছিলাম যে আমি ক্লায়েন্টকে জেএসএন বস্তুর বৈশিষ্ট্য হিসাবে ক্রমাগত ফিরিয়ে দিচ্ছি যাতে আমার তাদের স্ট্রিংয়ের সাথে রেন্ডার করার প্রয়োজন হয়। এখানে তুমি যাও:
public static string RenderPartialViewToString(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.ToString();
}
}
এটি পুরো পরিবর্তনের পাশাপাশি আংশিক দর্শনের জন্য কাজ করবে, কেবলমাত্র এতে পরিবর্তন ViewEngines.Engines.FindPartialViewকরুন ViewEngines.Engines.FindView।
thisনিয়ন্ত্রকের যুক্তি হিসাবে পাস করুন । RenderPartialViewToString(this, "index", viewModel)। আমি মনে করি এটি নির্বোধ যে সহজভাবে ভিউ ইঞ্জিনটি চালিত করার এবং কোনও স্ট্রিং ফিরে পাওয়ার কোনও সহজ উপায় নেই, তবে এএসপি.নেটে ভিউ ইঞ্জিনটির সাথে ভিউ সংকলন করতে নিয়ামক উদাহরণের সাথে রেফারেন্স প্রয়োজন। আমি এখন একটি নোডজেএস বিকাশকারী এবং নোডে ইঞ্জিনগুলি দেখানো সম্পূর্ণ পৃথক মডিউল যা আপনি ম্যানুয়ালি বা এক্সপ্রেসের মতো এমভিসি কাঠামো সহ প্রার্থনা করতে পারেন ।
উপরে @ শেভের গৃহীত উত্তরগুলি ভাল, তবে আমি কেবল একটি নির্দিষ্ট দৃষ্টিভঙ্গি নয়, একটি নির্দিষ্ট ক্রিয়াটির ফলাফল রেন্ডার করতে চেয়েছিলাম ।
এছাড়াও, আমার কোনও মডেল ইনজেকশনের উপর নির্ভর করার পরিবর্তে সেই ক্রিয়ায় প্যারামিটারগুলি পাস করতে সক্ষম হওয়া দরকার।
সুতরাং আমি আমার নিজস্ব পদ্ধতিটি নিয়ে এসেছি, যা আমি আমার নিয়ন্ত্রকদের বেস ক্লাসে রেখেছি (এটি তাদের সকলের কাছে উপলভ্য করে):
protected string RenderViewResultAsString(ViewResult viewResult)
{
using (var stringWriter = new StringWriter())
{
this.RenderViewResult(viewResult, stringWriter);
return stringWriter.ToString();
}
}
protected void RenderViewResult(ViewResult viewResult, TextWriter textWriter)
{
var viewEngineResult = this.ViewEngineCollection.FindView(
this.ControllerContext,
viewResult.ViewName,
viewResult.MasterName);
var view = viewEngineResult.View;
try
{
var viewContext = new ViewContext(
this.ControllerContext,
view,
this.ViewData,
this.TempData,
textWriter);
view.Render(viewContext, textWriter);
}
finally
{
viewEngineResult.ViewEngine.ReleaseView(this.ControllerContext, view);
}
}
ধরুন আমার কাছে একটি অ্যাকশন রয়েছে যা Fooএকটি মডেল অবজেক্ট এবং কিছু অন্যান্য পরামিতি নেয়, যা একসাথে কী ভিউ ব্যবহৃত হবে তা প্রভাবিত করে:
public ViewResult Foo(MyModel model, int bar)
{
if (bar == 1)
return this.View("Bar1");
else
return this.View("Bar2", model);
}
এখন, যদি আমি কলিং অ্যাকশনের ফলাফল পেতে চাই Foo, আমি কেবল পদ্ধতিটি ViewResultআহ্বান করে এইটি পেতে পারি Fooএবং তারপরে RenderViewResultAsStringএইচটিএমএল পাঠ্য পেতে কল করতে পারি:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
masterName) দরকার যা আপনি নালাকে নির্দিষ্ট করবেন। এছাড়াও আমি সংরক্ষণ এবং পুনর্স্থাপনের প্রস্তাব করছি (রেন্ডারিংয়ের পরে) কন্ট্রোলার.ভিউ ডেটা.মোডেল যদি বর্তমান কন্ট্রোলার উদাহরণটিতে পদ্ধতিটি কল করা হয় এবং মডেলটি এই কল করার আগে নির্ধারিত করা হয়।