এমভিসি 3: অ্যাজ্যাক্সের মাধ্যমে লোড হওয়ার সময় এর বিন্যাস পৃষ্ঠাটি ছাড়া কোনও দৃশ্য কীভাবে রেন্ডার করবেন?


153

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

ভিউস্টার্ট পৃষ্ঠাটি ভিউ ফোল্ডারের মূলের মধ্যে রয়েছে এবং এইভাবে সমস্ত দর্শনগুলিতে প্রযোজ্য। এটি নির্দিষ্ট করে যে সমস্ত দর্শন _Layout.cshtmlতাদের লেআউট পৃষ্ঠার জন্য ব্যবহার করা উচিত । বিন্যাস পৃষ্ঠায় দুটি নেভিগেশন লিঙ্ক রয়েছে, প্রতিটি দর্শনের জন্য একটি। লিঙ্কগুলি @Html.ActionLink()পৃষ্ঠায় নিজেকে রেন্ডার করতে ব্যবহার করে।

এখন আমি jQuery যুক্ত করেছি এবং এই লিঙ্কগুলি হাইজ্যাক করতে এবং পৃষ্ঠায় তাদের বিষয়বস্তু গতিশীলভাবে লোড করতে এজাক্স ব্যবহার করতে চাই।

<script type="text/javascript">
    $(function () {
        $('#theLink').click(function () {
            $.ajax({
                url: $(this).attr('href'),
                type: "GET",
                success: function (response) {
                    $('#mainContent').html(response);
                }
            });
            return false;
        });
    });
</script>

এটি করার জন্য আমি দুটি উপায় ভাবতে পারি তবে আমি বিশেষত দুটি পছন্দ করি না:

1) আমি সম্পূর্ণ ভিউ এর সামগ্রীগুলি নিতে পারি এবং আংশিক দৃশ্যে এগুলি রাখতে পারি, তারপরে মূল দৃশ্যটি যখন রেন্ডার করা হয় তখন আংশিক দৃশ্যে কল করুন। এইভাবে, Request.IsAjaxRequest()নিয়ামকটি ব্যবহার করে , আমি অনুরোধটি অ্যাজাক্স অনুরোধ কিনা সেটির ভিত্তিতে আমি ফিরে যেতে View()বা ফিরে আসতে পারি PartialView()। আমি আজাক্স অনুরোধে নিয়মিত ভিউটি ফিরিয়ে দিতে পারি না কারণ এটির পরে লেআউট পৃষ্ঠাটি ব্যবহার করা হবে এবং আমি ইনজেক্টেড লেআউট পৃষ্ঠার একটি দ্বিতীয় অনুলিপি পাব। যাইহোক, আমি এটি পছন্দ করি না কারণ এটি @{Html.RenderPartial();}স্ট্যান্ডার্ড জিইটি অনুরোধের জন্য খালি ভিউগুলি তৈরি করতে বাধ্য করে ।

    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return PartialView("partialView");
        else
            return View();
    }

তারপরে সূচী। সিটিএসটিএমএলে এটি করুন:

@{Html.RenderPartial("partialView");}

2) আমি _ ভিউস্টার্ট থেকে বিন্যাসের পদবী সরিয়ে ফেলতে পারি এবং অনুরোধটি অ্যাজাক্স না হলে ম্যানুয়ালি এটি নির্দিষ্ট করতে পারি:

    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return View(); // Return view with no master.
        else
            return View("Index", "_Layout"); // Return view with master.
    }

কারও কি এর চেয়ে ভাল পরামর্শ আছে? বিন্যাসের পৃষ্ঠাটি ছাড়া কোনও দর্শন ফিরে পাওয়ার কী উপায় আছে? এটি একটি এজাক্স অনুরোধ থাকলে স্পষ্টভাবে "আপনার বিন্যাসটি অন্তর্ভুক্ত করবেন না" বলা আরও সহজ হবে, এটি অ্যাজাক্স না থাকলে স্পষ্টভাবে লেআউটটি অন্তর্ভুক্ত করা হবে।

উত্তর:


259

ইন ~/Views/ViewStart.cshtml:

@{
    Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml";
}

এবং নিয়ামক মধ্যে:

public ActionResult Index()
{
    return View();
}

3
এটি কি ভিউস্টার্টে নির্দিষ্ট করা যেতে পারে?
শেভ

10
@ ম্যাট গ্রেয়ার, আপনি এটিকে নোংরা বলেছেন, আমি একে DRY বলি, বিষয়বস্তু স্টাফ যাই হোক :-)
ডারিন দিমিত্রভ

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

1
আপনি কি বেস কন্ট্রোলারে এটি করতে পারবেন না, ভিউডাটাতে একটি সম্পত্তি সেট করে তা ব্যবহার করতে পারেন? তাহলে লাইন হবে Layout = ViewBag.LayoutFile
আরপিএম 1984

2
আমি মনে করি আমি পারতাম তবে সত্যিই কেন একটি সামান্য লাইনের জন্য বেসকন্ট্রোলার তৈরি করব?
শেভ

92

কেবলমাত্র নীচের কোডটি পৃষ্ঠার শীর্ষে রাখুন

@{
    Layout = "";
}

4
এটি কাজ করে না কারণ এজেএক্সের মাধ্যমে অনুরোধ করা হয়েছে বা না তার ভিত্তিতে আমি লেআউটটি চালু বা বন্ধ করতে সক্ষম হতে চাই। এটি আপনাকে টোগল না করে কেবলমাত্র বিন্যাসটি বন্ধ করতে দেয়।
শেভ

4
এই কেন ভোট আপ আছে ?? প্লিজ ব্যাখ্যা করুন তাই আমিও এটিতে ভোট দিয়ে যাব।
উসমান ইউনাস 23'13

1
@UsmanY। আপনার এটি ভোট দেওয়ার দরকার নেই। কিন্তু আমি করি. আমার তর্ক google.com.pk/#q=mvc3%20 ভিউ ১০২০ ছাড়া বিনা ২০২০ আউটতে যান । এবং এটি যে প্রশ্নের সঠিক উত্তর।
সামি

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

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

13

আমি আপনার # 1 বিকল্পটি পছন্দ করি এবং ব্যবহার করি। আমি # 2 পছন্দ করি না কারণ আমার কাছে View()বোঝানো হয় আপনি পুরো পৃষ্ঠাটি ফিরিয়ে দিচ্ছেন। একবার ভিউ ইঞ্জিনটি এটির সাথে হয়ে গেলে এটি সম্পূর্ণরূপে ছাঁটাই করা এবং কার্যকর বৈধ HTML পৃষ্ঠা হওয়া উচিত should PartialView()এইচটিএমএলের স্বেচ্ছাসেবী খণ্ডগুলি ফিরিয়ে আনার জন্য তৈরি করা হয়েছিল।

আমি মনে করি না যে কেবলমাত্র একটি আংশিক কল করে এমন একটি দৃষ্টিভঙ্গি রাখা বড় বিষয়। এটি এখনও DRY, এবং আপনাকে দুটি পরিস্থিতিতে পার্টিশনের যুক্তি ব্যবহার করতে দেয়।

অনেক লোক তাদের ক্রিয়াকলাপের কলগুলির সাথে টুকরো টুকরো করা পছন্দ করে Request.IsAjaxRequest()না এবং আমি এটির প্রশংসা করতে পারি। কিন্তু আইএমও, সিদ্ধান্ত নেওয়ার যদি সব করছ কিনা কল View()বা PartialView()তারপর শাখা একটি বড় চুক্তি হয় না এবং বজায় রাখা সহজ (এবং টেস্ট) করা হয়। IsAjaxRequest()আপনার ক্রিয়াটি কীভাবে কার্যকর হয় তার বড় অংশগুলি নির্ধারণ করতে যদি আপনি নিজেকে খুঁজে পান তবে আলাদা একটি এজেএক্স ক্রিয়া করা সম্ভবত আরও ভাল।


13

দুটি বিন্যাস তৈরি করুন: 1. খালি বিন্যাস, ২। প্রধান বিন্যাস এবং তারপরে _ভিউ স্টার্টটিতে এই কোডটি লিখুন:

@{
if (Request.IsAjaxRequest())
{
    Layout = "~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml";
}
else
{
    Layout = "~/Areas/Dashboard/Views/Shared/_Layout.cshtml";
}}

অবশ্যই, এটি সেরা সমাধান নয়


8

এর জন্য আপনাকে খালি ভিউ তৈরি করতে হবে না।

নিয়ামকটিতে:

if (Request.IsAjaxRequest())
  return PartialView();
else
  return View();

কোনও পার্টিশিয়ালভিউ রেজাল্ট ফিরিয়ে দেওয়া দায়বদ্ধতার সময় লেআউট সংজ্ঞাটিকে ওভাররাইড করে।


2

ASP.NET 5 এর সাথে আর কোনও অনুরোধ ভেরিয়েবল উপলব্ধ নেই। আপনি এখন এটিকে কনটেক্সট.রিকোয়েস্ট দিয়ে অ্যাক্সেস করতে পারেন

এছাড়াও কোনও ইসআজাক্সরেক্সেস্ট () পদ্ধতি নেই, আপনার নিজের দ্বারা এটি লিখতে হবে, উদাহরণস্বরূপ এক্সটেনশনগুলিতে tt HttpRequestExtensions.cs

using System;
using Microsoft.AspNetCore.Http;

namespace Microsoft.AspNetCore.Mvc
{
    public static class HttpRequestExtensions
    {
        public static bool IsAjaxRequest(this HttpRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            return (request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest");
        }
    }
}

আমি এখন এই বিষয়ে কিছুক্ষণ অনুসন্ধান করেছি এবং আশা করি এটি অন্য কয়েকজনকেও সহায়তা করবে;)

সংস্থান: https://github.com/aspnet/AspNetCore/issues/2729


-5

রেল অন রেল অ্যাপ্লিকেশনটির জন্য, আমি render layout: falseএজাক্স এইচটিএমএল এর সাথে প্রতিক্রিয়া জানাতে চাইনি এমন নিয়ন্ত্রক ক্রিয়ায় উল্লেখ করে একটি বিন্যাস লোড হওয়া থেকে রক্ষা করতে সক্ষম হয়েছি।


6
ট্যাগস: সি # এসপ নেট, রুবি নয়
মিঃ কেকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.