এএসপি.নেট এমভিসি রেজার: কীভাবে নিয়ন্ত্রণকারী ক্রিয়াকলাপের মধ্যে একটি রেজার আংশিক দেখুনটির এইচটিএমএল রেন্ডার করা যায়


97

এএসপি.নেট ভিউ ইঞ্জিনে প্রদত্ত আংশিক দৃশ্যের এইচটিএমএল কীভাবে তৈরি করা যায় তা জানা যায়

তবে এই কার্যকারিতাটি যদি রেজার আংশিক দৃশ্যে ব্যবহৃত হয় তবে এটি কাজ করে না, যেমন ব্যতিক্রম বলে যে আংশিক দৃষ্টিভঙ্গি "ইউজারকন্ট্রোল" থেকে প্রাপ্ত নয়।

রেজার আংশিক দৃষ্টিভঙ্গি সমর্থন করতে কীভাবে রেন্ডারিং ঠিক করবেন?

আমার এটি দরকার কারণ আমি ইমেলগুলি এই আংশিক দর্শনগুলি তৈরি করি ...

হালনাগাদ:

কোড যা ব্যর্থ হয় (@ এমসিএল):

public string RenderPartialToString(string controlName, object viewData)
    {
        ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
        viewPage.Url = this.GetUrlHelper();

        string fullControlName = "~/Views/Email/" + controlName + ".ascx";

        viewPage.ViewData = new ViewDataDictionary(viewData);
        viewPage.Controls.Add(viewPage.LoadControl(fullControlName));

        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            using (HtmlTextWriter tw = new HtmlTextWriter(sw))
            {
                viewPage.RenderControl(tw);
            }
        }
        return sb.ToString();
    }

4
আপনি এখন পর্যন্ত কোডটি প্রদর্শন করতে পারেন যা ব্যতিক্রম উত্পন্ন করে?
mlibby

উত্তর:


154
@Html.Partial("nameOfPartial", Model)

হালনাগাদ

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

    ViewData.Model = model;

    using (StringWriter sw = new StringWriter()) {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

হ্যাঁ, আপনি এইভাবে কোনও দৃশ্যের মধ্যে আংশিক দৃশ্য উপস্থাপন করেন। তবে কীভাবে এটি একটি নিয়ামক পদক্ষেপের ভিতরে রেন্ডার করবেন?
পিটার স্টিগনার

এখন এটি দুর্দান্ত! রেজন এবং এএসপি স্বরলিপি দিয়ে কাজ করে।
পিটার স্টিগনার

4
একটি সাবকিউসিটিউন: অন্য কন্ট্রোলার স্কোপে থাকা ভিউটি কীভাবে রেন্ডার করব তারপরে বর্তমান? এটি "ইমেলকন্ট্রোলার" স্কোপ (ইমেল দেখার ফোল্ডার) এর মধ্যে রয়েছে বলুন?
পিটার স্টিগনার

4
এটি একটি দুর্দান্ত সমাধান ছিল। আমার ইমেল সহ সঠিক প্রয়োজন ছিল এবং এটি ব্যবহারের পছন্দ করেছিলাম।
uadrive

4
@ আমেখাদতকার: না। jquery ক্লায়েন্ট সাইড, ব্রাউজারে প্রেরণের আগে ভিউটি সার্ভার সাইডে উত্পন্ন হয়।
jgauffin

8

যদিও ইতিমধ্যে পর্যাপ্ত উত্তর দেওয়া হয়েছে, আমি একটি কম ভারবোজ সমাধান প্রস্তাব করতে চাই, এটি এমভিসি নিয়ামক শ্রেণিতে উপলব্ধ সহায়ক পদ্ধতি ছাড়া ব্যবহার করা যেতে পারে। "রেজারইঙ্গাইন" নামে একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে আপনি রেজার ফাইলের সামগ্রী এবং কল পেতে নেট ফাইল আইও ব্যবহার করতে পারেন

string html = Razor.Parse(razorViewContentString, modelObject);

তৃতীয় পক্ষের গ্রন্থাগার পান এখানে


5

আপনি এখানRenderView Controller extension থেকে ( উত্স) ব্যবহার করতে পারেন )

এবং এটি এর মতো ব্যবহার করুন:

public ActionResult Do() {
var html = this.RenderView("index", theModel);
...
}

এটি রেজার এবং ওয়েব-ফর্ম ভিউজাইনগুলির জন্য কাজ করে


লিঙ্কটি চেক করা হয়েছে। @ চুরকনোরিস হলেন এএসপিএনটি এমভিসি আশ্চর্যর লেখক যা সংস্করণ ২.০ থেকে বাণিজ্যিক পণ্য (বর্তমানে সর্বশেষ প্রকাশ 12 মার্চ 2012)। সংস্করণ 1.9 (সর্বশেষ প্রকাশ জুন 9 2011) এখনও উন্মুক্ত উত্স, তবে সম্ভবত আর কোনও বিকাশ হবে না। 1.9 এর কোন কাঁটাচামচ আছে?
জোয়েল পুররা

@ ওমু: রেন্ডারভিউ অকার্যকর। দেখুন msdn.microsoft.com/en-us/library/...
রোল্যান্ড

@ রোল্যান্ড এটি একটি কাস্টম নিয়ামক এক্সটেনশন
ওমু

1

আমি দেখেছি যে কেউ একজন অন্য নিয়ামকের জন্য এটি কীভাবে করবেন তা ভাবছেন।

আমার ক্ষেত্রে আমার ভিউ / ইমেল ফোল্ডারে আমার ইমেল টেমপ্লেটগুলির সমস্ত ছিল, তবে আপনি যে নিয়ামকটির সাথে সম্পর্কিত তার সাথে যোগাযোগ রাখতে পেরে আপনি এটি সংশোধন করতে পারেন।

public static string RenderViewToString(Controller controller, string viewName, object model)
    {
        var oldController = controller.RouteData.Values["controller"].ToString();

        if (controller.GetType() != typeof(EmailController))
            controller.RouteData.Values["controller"] = "Email";

        var oldModel = controller.ViewData.Model;
        controller.ViewData.Model = model;
        try
        {
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName,
                                                                           null);

                var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);

                //Cleanup
                controller.ViewData.Model = oldModel;
                controller.RouteData.Values["controller"] = oldController;

                return sw.GetStringBuilder().ToString();
            }
        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

            throw ex;
        }
    }

মূলত এটি যা করে তা হ'ল একটি নিয়ন্ত্রণকারী যেমন অ্যাকাউন্টকন্ট্রোলার গ্রহণ করা এবং এটি ইমেলকন্ট্রোলার মনে করার জন্য এটি সংশোধন করে যাতে কোডটি Views/Emailফোল্ডারে প্রদর্শিত হবে। এটি করা দরকার কারণ FindViewপদ্ধতিটি প্যারামিটার হিসাবে সোজা পথ নেয় না, এটি একটি চায় ControllerContext

একবার স্ট্রিং রেন্ডারিং হয়ে গেলে, এটি অ্যাকাউন্টকন্ট্রোলারটিকে প্রতিক্রিয়া অবজেক্ট দ্বারা ব্যবহারের জন্য তার প্রাথমিক অবস্থায় ফিরিয়ে দেয়।


1

দুর্দান্ত কোড; সামান্য ইঙ্গিত: যদি আপনাকে কখনও কখনও আরও ডেটা বাইপাস করতে হয় তবে কেবল ভিউ মডেলকেই ..

 if (model is ViewDataDictionary)
 {
     controller.ViewData = model as ViewDataDictionary;
 } else {
     controller.ViewData.Model = model;
 }

4
আপনি আপনার উত্তরটি সম্পূর্ণ করেন নি
পুহদেডো

0

এইচটিএমএলহেল্পার এক্সটেনশন হিসাবে @ জাগাফিনের উত্তর ধার করা:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RenderPartialViewToString(
        this HtmlHelper html, 
        ControllerContext controllerContext, 
        ViewDataDictionary viewData,
        TempDataDictionary tempData,
        string viewName, 
        object model)
    {
        viewData.Model = model;
        string result = String.Empty;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
            ViewContext viewContext = new ViewContext(controllerContext, viewResult.View, viewData, tempData, sw);
            viewResult.View.Render(viewContext, sw);

            result = sw.GetStringBuilder().ToString();
        }

        return MvcHtmlString.Create(result);
    }
}

একটি রেজার ভিউতে ব্যবহার:

Html.RenderPartialViewToString(ViewContext, ViewData, TempData, "Search", Model)

4
আপনি @ এইচটিএমএল. পার্টিশিয়াল (স্ট্রিং আংশিকভিউনাম, অবজেক্ট মডেল, ভিউডাটাডেটরিওয়ের ভিউ ডেটা) ব্যবহার করে পার্থক্যটি ব্যাখ্যা করতে পারেন? এইচটিএমএলহেল্পারের প্রয়োজন হওয়ার পরে কী কী সুবিধা রয়েছে?
বিকেকিসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.