এমভিসি 3 রেজারে, আমি কীভাবে কোনও ক্রিয়াকলাপের মধ্যে রেন্ডার করা ভিউটির এইচটিএমএল পাব?


90

কেউ কীভাবে কোনও অ্যাকশনের অভ্যন্তরে কোনও ভিউ তৈরির এইচটিএমএল পাবেন কীভাবে জানেন?

এটি কি এমন কিছু:

public ActionResult Do()
{
    var html = RenderView("hello", model);
...
}

উত্তর:


152

আমি ক্লাসে স্থিতিশীল পদ্ধতি ব্যবহার করি 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


14
ফাইন্ডভিউয়ের জন্য অন্য একটি প্যারামিটার ( masterName) দরকার যা আপনি নালাকে নির্দিষ্ট করবেন। এছাড়াও আমি সংরক্ষণ এবং পুনর্স্থাপনের প্রস্তাব করছি (রেন্ডারিংয়ের পরে) কন্ট্রোলার.ভিউ ডেটা.মোডেল যদি বর্তমান কন্ট্রোলার উদাহরণটিতে পদ্ধতিটি কল করা হয় এবং মডেলটি এই কল করার আগে নির্ধারিত করা হয়।
আন্দ্রে রেনিয়া

4
আপনাকে ভিউরেসাল্ট.ভিউজিনিউইনও বলা উচিত e রিলেজভিউ (কন্ট্রোলার.কন্ট্রোলার কনটেক্সট, ভিউ রিসাল্ট.ভিউ)
সজমেভেট

4
এটি দুর্দান্ত কাজ করে তবে আমি আমার লাইভ কোডে ব্যতিক্রমগুলি ধরতে এবং রেন্ডার করতে চাই না।
পাওলোয়া

4
আপনি যদি এটি নিয়ামকের মধ্যে থেকেই কল করে থাকেন তবে কেবল thisনিয়ন্ত্রকের যুক্তি হিসাবে পাস করুন । RenderPartialViewToString(this, "index", viewModel)। আমি মনে করি এটি নির্বোধ যে সহজভাবে ভিউ ইঞ্জিনটি চালিত করার এবং কোনও স্ট্রিং ফিরে পাওয়ার কোনও সহজ উপায় নেই, তবে এএসপি.নেটে ভিউ ইঞ্জিনটির সাথে ভিউ সংকলন করতে নিয়ামক উদাহরণের সাথে রেফারেন্স প্রয়োজন। আমি এখন একটি নোডজেএস বিকাশকারী এবং নোডে ইঞ্জিনগুলি দেখানো সম্পূর্ণ পৃথক মডিউল যা আপনি ম্যানুয়ালি বা এক্সপ্রেসের মতো এমভিসি কাঠামো সহ প্রার্থনা করতে পারেন ।
শেভ

4
@ পাওলো ম্যানুয়েলস্যান্টোস আমি আপনার সাথে একমত আমি এই বছর আগে লিখেছি এবং উত্তরে ত্রুটি পরিচালনা করে আমি কী ভাবছিলাম তা জানি না। চেষ্টা / ধরা বাদ দেওয়ার জন্য উত্তরটি আপডেট করেছি। সাহায্য করার জন্য ধন্যবাদ.
শেভ

4

উপরে @ শেভের গৃহীত উত্তরগুলি ভাল, তবে আমি কেবল একটি নির্দিষ্ট দৃষ্টিভঙ্গি নয়, একটি নির্দিষ্ট ক্রিয়াটির ফলাফল রেন্ডার করতে চেয়েছিলাম ।

এছাড়াও, আমার কোনও মডেল ইনজেকশনের উপর নির্ভর করার পরিবর্তে সেই ক্রিয়ায় প্যারামিটারগুলি পাস করতে সক্ষম হওয়া দরকার।

সুতরাং আমি আমার নিজস্ব পদ্ধতিটি নিয়ে এসেছি, যা আমি আমার নিয়ন্ত্রকদের বেস ক্লাসে রেখেছি (এটি তাদের সকলের কাছে উপলভ্য করে):

    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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.