এএসপি.নেট এমভিসিতে কোনও দৃশ্য বিদ্যমান?


95

ভিউ রেন্ডার করার আগে কোনও নিয়ামকের মধ্যে থেকে নির্দিষ্ট ভিউয়ের নাম উপস্থিত থাকে কিনা তা নির্ধারণ করা সম্ভব?

রেন্ডার করার জন্য আমার ভিউটির নামটি গতিশীলভাবে নির্ধারণ করা দরকার। যদি সেই নামটি দিয়ে কোনও দৃশ্য উপস্থিত থাকে তবে আমার সেই ভিউ রেন্ডার করতে হবে। যদি কাস্টম নামে কোনও ভিউ না থাকে তবে আমাকে ডিফল্ট ভিউ রেন্ডার করতে হবে।

আমি আমার নিয়ামকের মধ্যে নিম্নলিখিত কোডের অনুরূপ কিছু করতে চাই:

public ActionResult Index()
{
    var name = SomeMethodToGetViewName();

    // The 'ViewExists' method is what I've been unable to find.
    if (ViewExists(name))
    {
        retun View(name);
    }
    else
    {
        return View();
    }
}

14
কেবল এর শিরোনামটি পড়ে এটি খুব গভীর দার্শনিক প্রশ্নের মতো মনে হচ্ছে।

উত্তর:


155
 private bool ViewExists(string name)
 {
     ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);
     return (result.View != null);
 }

যারা অনুলিপি / পেস্ট এক্সটেনশন পদ্ধতি খুঁজছেন তাদের জন্য:

public static class ControllerExtensions
{
    public static bool ViewExists(this Controller controller, string name)
    {
        ViewEngineResult result = ViewEngines.Engines.FindView(controller.ControllerContext, name, null);
        return (result.View != null);
    }
}

4
এটি সম্ভবত আরও ভাল। আমি জানিনি যে ভিউইঞ্জাইনস সংগ্রহের বাইরেই ফাইন্ড ভিউ পদ্ধতি রয়েছে।
ল্যান্স হার্পার

4
তবে অন্যান্য নিয়ন্ত্রণকারীর জন্য ভিউটি বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন?
সোর্ডিডার

একদিকে যেমন: আমাদের একজন ইঞ্জিনিয়ার (যেহেতু এগিয়ে চলেছেন) একটি কাস্টম ভিউ ইঞ্জিন তৈরি করেছেন (মাল্টিটেন্যান্টভিউজাইন নামে পরিচিত, সুতরাং আপনি এর উদ্দেশ্যটি উপলব্ধি করুন) যা ফাইন্ডভিউকে একটি এইচটিপিএক্সেপশন (404) নিক্ষেপ করতে কার্যকর করে যদি এটি না পায় তবে দর্শন এই ভাল অনুশীলন? আমার কোন ধারণা নাই. তবে সেখানে যদি অন্যান্য বাস্তবায়ন হয় তবে অবাক হবেন না। যেহেতু আপনি এই ইঞ্জিনটি কার্যকর করেন হিসাবে ভিউ ইঞ্জিনের অভ্যন্তরীণ কাজগুলি জানেন না, তাই আপনি হয়ত একটি ক্যাচ ফেলে দিতে চান - মিথ্যা ফিরুন; pu এই কুকুরছানাটির চারপাশে, কেবল নিরাপদ থাকতে।
ব্রায়ান কোলাভিটো

4
@ এসআরইডার, আমি পরীক্ষিত কিন্তু এই আইসিএনট্রোলার নিয়ন্ত্রক = নতুন হোমকন্ট্রোলার (); এবং তারপরে controller.ControllerContext এমন জিনিস দেবে যা আপনি অনুসন্ধান পদ্ধতিতে সন্ধান করতে পারেন।
বিশাল শর্মা

এই উত্তরের জন্য ধন্যবাদ। এটি আমাকে অন্য সমস্যায় সহায়তা করেছিল। আমার দৃষ্টিভঙ্গি আংশিক কিনা তা আমার যাচাই করা দরকার এবং আমার সমস্ত দলের নাম আন্ডারলাইন দিয়ে শুরু হওয়ায় এখন আমি "রেজাল্ট.ভিউ! = নাল" কিনা আমার সমাধান পরীক্ষা করে কাজ করতে পারি
ডাইস ভিসেন্টিন

19

আপনি কেবলমাত্র একটি ভিউ ইঞ্জিন ব্যবহার করছেন তা ধরে নিলে ধরে নিচের মতো কিছু করার চেষ্টা করুন:

bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null;

দেখে মনে হচ্ছে এটি গ্রহণযোগ্য উত্তরের 3 মিনিট আগে পোস্ট করা হয়েছিল এবং এখনও কোনও ভালবাসা নেই ?! আমার কাছ থেকে +1
ট্রেভর ডি কোয়েকোয়েক

@ ট্রেভার্ডকোইককোয়েক ... হুম ... + 1
বিশাল শর্মা

8

এটি করার আরও একটি উপায় [অগত্যা প্রস্তাবিত নয়)'s

 try
 {
     @Html.Partial("Category/SearchPanel/" + Model.CategoryKey)
 }
 catch (InvalidOperationException) { }

এটি একটি .cshtml ফাইলের মধ্যে আংশিক দৃশ্যের উপস্থিতি পরীক্ষা করার জন্য। এটি আসলে এই প্রশ্নের উত্তর নয়, তবে অন্য একটি প্রশ্ন যা এখানে লিঙ্কগুলি ভুলভাবে বন্ধ ছিল তাই আমি আমার উত্তরটি এখানে রেখে যাচ্ছি
সাইমন_উইভার

4
এটি আসলে আমার ব্যবহারের জন্য স্পট ছিল, যেহেতু আমি একটি সংস্কৃতি নির্দিষ্ট আংশিক দৃষ্টিভঙ্গি ব্যবহার করার উপায় খুঁজছিলাম। সুতরাং আমি এটিকে কেবল সংস্কৃতির নির্দিষ্ট ভিউয়ের নাম দিয়ে ডেকেছি এবং তারপরে ক্যাচের অভ্যন্তরে ডিফল্ট ভিউ বলেছি। এবং আমি এটি একটি ইউটিলিটি ফাংশনে করছিলাম, সুতরাং পদ্ধতির প্রয়োজন ControllerContextমতো আমার কোনও অ্যাক্সেস ছিল না FindView
আশ্চর্য

2

আপনি যদি ডেভের প্রদত্ত সমাধানটির ভিত্তিতে একাধিক নিয়ামক ক্রিয়াকলাপটি এটি পুনরায় ব্যবহার করতে চান তবে আপনি একটি কাস্টম ভিউ ফলাফলটিকে নীচে হিসাবে সংজ্ঞায়িত করতে পারেন:

public class CustomViewResult : ViewResult
{
    protected override ViewEngineResult FindView(ControllerContext context)
    {
        string name = SomeMethodToGetViewName();

        ViewEngineResult result = ViewEngines.Engines.FindView(context, name, null);

        if (result.View != null)
        {
            return result;
        }

        return base.FindView(context);
    }

    ...
}

তারপরে আপনার ক্রিয়াকলাপে কেবল আপনার কাস্টম দর্শনটির উদাহরণটি ফিরে আসুন:

public ActionResult Index()
{ 
    return new CustomViewResult();
}

1
ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null

আমার 2 সেন্ট।


1

এসপ নেট কোর ২.x এ ViewEnginesসম্পত্তি আর বিদ্যমান নেই তাই আমাদের ICompositeViewEngineপরিষেবাটি ব্যবহার করতে হবে । নির্ভরতা ইনজেকশন ব্যবহার করে গৃহীত উত্তরের এটি একটি বৈকল্পিক:

public class DemoController : Controller
{
    private readonly IViewEngine _viewEngine;

    public DemoController(ICompositeViewEngine viewEngine)
    {
        _viewEngine = viewEngine;
    }

    private bool ViewExists(string name)
    {
        ViewEngineResult viewEngineResult = _viewEngine.FindView(ControllerContext, name, true);
        return viewEngineResult?.View != null;
    }

    public ActionResult Index() ...
}

কৌতূহলের জন্য: বেস ইন্টারফেসটি IViewEngineকোনও পরিষেবা হিসাবে নিবন্ধভুক্ত নয় সুতরাং এর ICompositeViewEngineপরিবর্তে আমাদের অবশ্যই ইনজেকশন করতে হবে। FindView()পদ্ধতি তবে দ্বারা প্রদান করা হয় IViewEngine, যাতে সদস্য পরিবর্তনশীল মৌলিক ইন্টারফেস ব্যবহার করতে পারে।


0

কোর ২.২ এর জন্য রেজারে এটি কীভাবে করা যায় তা এখানে উল্লেখ করুন যে কলটি "গেটভিউ" নয়, "অনুসন্ধান দেখুন) নয় Note

@using Microsoft.AspNetCore.Mvc.ViewEngines
@inject ICompositeViewEngine Engine
...
@if (Engine.GetView(scriptName, scriptName, isMainPage: false).Success) 
{
    @await Html.PartialAsync(scriptName)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.