এমভিসি-তে একটি নিয়ামক থেকে অন্য কোনও নিয়ামক অ্যাকশনকে কীভাবে কল করবেন


153

কন্ট্রোলার এ থেকে আমাকে একটি কন্ট্রোলার বি অ্যাকশন ফাইলআপলোডএমএসভিউ কল করতে হবে এবং এর জন্য একটি পরামিতি পাস করতে হবে।

 Code---its not going to the controller B's FileUploadMsgView().
    In ControllerA
  private void Test()
    {

        try
        {//some codes here
            ViewBag.FileUploadMsg = "File uploaded successfully.";
            ViewBag.FileUploadFlag = "2";

            RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File   uploaded successfully" });
        }

     In ControllerB receiving part
  public ActionResult FileUploadMsgView(string FileUploadMsg)
    {
         return View();
    }

3
আমি জানি এই প্রশ্নটি পুরানো তবে আমার মতে আপনার এড চ্যাপেল থেকে উত্তরটি সেরা হিসাবে চিহ্নিত করা উচিত, টানসনের চেহারা হ্যাকের মতো মনে হচ্ছে, এটি এখনও বৈধ, তবে যখন আপনি এটি যেমন বোঝাতে চেয়েছিলেন ঠিক তখনই এটি কেন ব্যবহার করতে পারবেন? এবং পছন্দসই ফলাফলটি পান
আন্ডার্স এম

1
@AndersM। এডের উত্তর একটি পুনর্নির্দেশ করে। যখন আমি এই প্রশ্নের সমাধানের সন্ধান করতে পেলাম তখন আমি এটি চাই না।
mxmissile

@ এমএক্সমিসিল একটি ডিক হতে হবে না তবে এডের উত্তরটি যা প্রশ্নকর্তা প্রয়োজন যেহেতু তিনি আপলোড করা তথ্যের ভিত্তিতে ফিরে আসা মতামত চান, আমি সম্মত যে প্রশ্নকারী তার প্রশ্ন গঠনের ক্ষেত্রে আরও ভাল কাজ করতে পারত (এটি কি সঠিক শব্দ? ) আমরা এটি জানতে পারি না যদিও তার ইংরেজি সীমিত হতে পারে, যদিও টাইসনস উত্তর আপনাকে সহায়তা করেছিল - যা ভাল - এডের উত্তরটি প্রশ্নকর্তাকে কী প্রয়োজন তা প্রতিফলিত করে - এই সত্যটি পরিবর্তন হয় না
এন্ডার্স এম

2
@AndersM। আমি বুঝতে পেরেছি, আমার মন্তব্য শব্দবন্ধটি কেবল খারাপ ছিল ... :-) আমার উচিত ছিল এমন পয়েন্টটি জোর দেওয়া উচিত যা আমার পছন্দসই ফলাফল ছিল না ।
এমএক্সমিসাইল

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

উত্তর:


106

কন্ট্রোলাররা কেবল ক্লাস - নতুন এক আপ এবং অ্যাকশন পদ্ধতিতে কল করুন আপনি যেমন অন্য কোনও শ্রেণির সদস্যকে চান:

var result = new ControllerB().FileUploadMsgView("some string");


76
আপনি যদি কেবল এটি করেন তবে আপনি কি কন্ট্রোলার কনটেক্সট, অনুরোধ এবং বন্ধুদের হারিয়ে যাবেন না?
cirrus

20
নিয়ামকের ইনস্ট্যান্টেশন একটি ভাল ধারণা নয় কারণ এটির জীবনচক্র অ্যাপ্লিকেশনটির অন্য একটি অংশ দ্বারা নিয়ন্ত্রিত হতে পারে। যেমন একটি আইওসি ধারক সব depdencies ইনজেকশনের করা উচিত, ইত্যাদি ব্যবহার
মো Valipour

48
আপনি যদি আইওসি ব্যবহার করে থাকেন তবে আপনি একটি জনবহুল নিয়ামকটি পেতে পারেনvar controller = DependencyResolver.Current.GetService<ControllerB>();
এমএক্সমিসিল

3
@mxmissile এটি এখানে একটি মন্তব্য না করে একটি নতুন উত্তর হিসাবে যুক্ত করা উপযুক্ত।
টাইসন টি।

2
@ আইলাসনো আপনি কি "নিয়ন্ত্রণের বিপরীতমুখী" শব্দটির সাথে পরিচিত? তিনি যে কথাটি বলছেন সেটি হ'ল যদি আপনার কন্ট্রোলারগুলিতে কনস্ট্রাক্টরতে ইনজেকশন লাগানো দরকার হয় তবে আমার উত্তরটি সত্যিই কাজ করে না, যদি না আপনি সার্ভিস-লোকেটার হিসাবে DependencyResolver এর মতো কিছু ব্যবহার করেন।
টাইসন টি।

202

@ এমএক্সমিসিল যেমন গৃহীত উত্তরের মন্তব্যে বলেছে, আপনাকে নিয়ামকটি নতুন করা উচিত নয় কারণ এটি আইওসি-র জন্য নির্ধারিত নির্ভরতা হারিয়ে ফেলবে এবং থাকবে না HttpContext

পরিবর্তে, আপনার নিজের নিয়ামকের একটি উদাহরণ পাওয়া উচিত:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);

ঠিক আমি খুঁজছেন ছিল কি. মনে রাখবেন যে IoC ব্যবহার করছেন না তারা এখনও HttpContextইনজেকশন পাবেন না ।
brichins

var controllerControllerBহ্যাঁ, টাইপ করা হবে ।
ডিএলহ

1
এটি আমার কাছাকাছি পৌঁছেছে, তবে একটি সমস্যা দেখা দেয় তা হ'ল আমার ক্ষেত্রে, কন্ট্রোলার মাইঅ্যাকশন () ইউজারকে উল্লেখ করে d
রবার্ট এইচ। বোর্দো

1
@ilasno আমি এই দিন MVC উপর মরিচা, কিন্তু আমি মনে হয় আমি বোঝানো আপনি আসলে আছে আছে আইওসি একটি সম্পূর্ণরূপে জনবহুল কন্ট্রোলার বস্তুর পেতে সেট আপ (যেমন একটি সংশ্লিষ্ট HttpContext)। আমি বিশ্বাস করি যে আমি কোনও আইওসি ছাড়াই এই পদ্ধতিটি একটি "অগভীর" নিয়ামক বস্তু পেতে (কেবলমাত্র নির্দিষ্ট কার্যকারিতার অ্যাক্সেসের প্রয়োজন) পেতে ব্যবহার করেছি এবং কেন অংশগুলি "অনুপস্থিত" ছিল তা নিয়ে প্রাথমিকভাবে বিভ্রান্ত হয়েছিলাম। [একপাশে: আমি এখনও এই পদ্ধতির ব্যবহার করার সময় এটির চারপাশে কাজ করেছি, তবে সম্ভবত সেই কার্যকারিতাটি একটি অংশীদারি শ্রেণীর কাছে প্রকাশ করা উচিত ছিল]] আইওসি সেটআপ এবং পছন্দগুলি সম্পর্কে, আপনাকে অন্যান্য নিবন্ধ / এসও প্রশ্নগুলির জন্য আপনাকে উল্লেখ করতে হবে।
brichins

3
কিছু লোক নিরর্থক সম্পাদনা নিয়ে চলে যায় ... নোট করুন যে কেউ পরিবর্তনটি "কন্ট্রোলার" কে "ctrlr" এ পরিবর্তন করে উত্তর সম্পাদনা করেছে ... সুতরাং এটি "ctrlr.ControllerContext = নতুন কন্ট্রোলার কনটেক্সট (this.Request.RequestContext, ctrl) পড়তে হবে ; " যদি সেই ব্যবহারকারী এটি সঠিকভাবে সম্পাদনা করে
জোশার্প

62

আপনার নমুনা psuedo কোড মত দেখাচ্ছে। আপনাকে এর ফলাফলটি ফেরত দিতে হবে RedirectToAction:

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });

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

13
এটি একটি 302 প্রদান করে যা সার্ভারে আবার একটি হিট ঘটায় যা প্রশ্নটি জিজ্ঞাসা করে না।
rboarman

16

@DLeh পরিবর্তে ব্যবহার করুন বলে

var controller = DependencyResolver.Current.GetService<ControllerB>();

তবে, নিয়ামককে একটি নিয়ামক সরবরাহকারী প্রবন্ধটি গুরুত্বপূর্ণ, বিশেষত যখন আপনাকে Userঅবজেক্ট, Serverঅবজেক্ট বা HttpContext'শিশু' নিয়ামকের অভ্যন্তরে অ্যাক্সেস করতে হয় ।

আমি কোডের একটি লাইন যুক্ত করেছি:

controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);

অন্যথায় আপনি বর্তমান প্রসঙ্গটি অ্যাক্সেস করতে Serverবা প্রারম্ভিক স্মৃতিযুক্ত বস্তুগুলিকে অ্যাক্সেস করতে সিস্টেম.ওয়েব ব্যবহার করতে পারতেন

এনবি: আমি ফ্রেমওয়ার্ক সংস্করণ 4.6 (এমভিসি 5) লক্ষ্য করছি


4
আপনি যদি নিয়ন্ত্রকের এমন কোনও অ্যাকশন কল করার চেষ্টা করেন যা ভিউ (..) বা আংশিকভিউ (...) ব্যবহার করে আপনাকে ম্যানুয়ালি রুট ডেটা পরিবর্তন করতে হবে, যাতে এএসপি.এনইটি আপনার ভিউ কীভাবে সন্ধান করতে পারে তা জানে। controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";ধরে নিচ্ছি আপনি হোম কন্ট্রোলারের সূচক ক্রিয়া থেকে ফলাফলটি ফেরত দেওয়ার চেষ্টা করছেন।
স্টিভেন

@Steven আমি এই মান প্রয়োগ করা ছিল thisবদলে controller। শেষ পর্যন্ত ফলাফলটি স্থানীয় কন্ট্রোলারের মাধ্যমে ফিরে আসে (এটি) যাতে দৃষ্টিভঙ্গির সন্ধানের চেষ্টা শেষ হয়।
aaantoine

আমি আরও যোগ করব যে ইউরাল সম্পত্তি ডিপেন্ডেন্সি রিসলভার.কন্টেনার.গেট সার্ভিস <কন্ট্রোলার বি> () এর মাধ্যমে আরম্ভ করা হয়নি। সুতরাং আপনাকে এটিকে ম্যানুয়ালি বর্তমান নিয়ামক থেকে অনুলিপি করতে হবে।
র‌্যালফিউস

লক্ষ্যমাত্রার অ্যাকশনে আপনার return View("ViewName");পরিবর্তে কেবল ব্যবহার করা উচিতreturn View();
এমনেজকো

9

সমাধানকারীটিকে স্বয়ংক্রিয়ভাবে এটি করতে দিন।

ভিতরে একটি নিয়ামক:

public class AController : ApiController
{
    private readonly BController _bController;

    public AController(
    BController bController)
    {
        _bController = bController;
    }

    public httpMethod{
    var result =  _bController.OtherMethodBController(parameters);
    ....
    }

}

2
ইমো সবচেয়ে পরিষ্কার উত্তর, তবে আপনার নিয়ামকটি নতুন নিয়ন্ত্রণকারীর প্রসঙ্গে সেট করা উচিত।
মাফাই

8

যদি কেউ কীভাবে। নেট কোরটিতে এটি করতে হয় সেদিকে নজর দিচ্ছে আমি স্টার্টআপে নিয়ামক যুক্ত করে এটি সম্পন্ন করেছি

services.AddTransient<MyControllerIwantToInject>();

তারপরে অন্য কন্ট্রোলারে এটি ইনজেক্ট করা

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

     public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
       _myControllerIwantToInject = myControllerIwantToInject;
      }

তারপরে ঠিক এটির মতো কল করুন _myControllerIwantToInject.MyMethodINeed();


4

RedirectToAction()জটিল শ্রেণীর অবজেক্টগুলি পাস করবে না এটি সন্ধানের পরে ঠিক আমি যা খুঁজছিলাম ।

উদাহরণ হিসাবে, আমি কন্ট্রোলারে IndexComparisonপদ্ধতিটি কল করতে LifeCycleEffectsResultsএবং এটি মডেল নামে একটি জটিল শ্রেণীর অবজেক্টটি পাস করতে চাই।

এখানে কোডটি ব্যর্থ হয়েছে:

return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);

লক্ষণীয় বিষয় হ'ল স্ট্রিংস, পূর্ণসংখ্যা ইত্যাদি এই নিয়ামক পদ্ধতির ভ্রমনে বেঁচে ছিলেন, তবে জেনেরিক তালিকাগুলি সি মেমরি ফাঁসের স্মরণ করিয়ে দেওয়ার কারণে ভুগছিলেন।

উপরে প্রস্তাবিত হিসাবে, আমি এখানে কোডটি এর সাথে প্রতিস্থাপন করেছি:

var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();

var result = controller.IndexComparison(model);
return result;

সব এখন ইচ্ছে মত কাজ করছে। পথ পরিচালনার জন্য আপনাকে ধন্যবাদ।


3

ডিলেহের উত্তরটি সঠিক এবং আইওসির জন্য নিখোঁজ নির্ভরতা ছাড়াই অন্য কোনও নিয়ামকের উদাহরণ কীভাবে পাবেন তা ব্যাখ্যা করুন

যাইহোক, আমাদের এখন এই অন্যান্য নিয়ামক থেকে পদ্ধতিটি কল করতে হবে।
সম্পূর্ণ উত্তর হবে:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");

যদি পরামিতিগুলি প্রত্যাশিত হয় তবে আপনি কীভাবে অ্যাকশনটিকে "মেথডনম ফ্রেমকন্ট্রোলার বি_টোক্যাল" কল করবেন? উদাহরণস্বরূপ, মেথডনামফ্রোম কন্ট্রোলার বি_টোকল (কিছুটা আগে, স্ট্রিং সামটেক্সট)?
পতি গুটি

3

আমি জানি এটি পুরানো, তবে আপনি পারবেন:

  • একটি পরিষেবা স্তর তৈরি করুন
  • পদ্ধতিটি সেখানে সরান
  • উভয় নিয়ন্ত্রকের মধ্যে কল পদ্ধতি

2

সমস্যা যদি কল করতে হয়। আপনি এই পদ্ধতিটি ব্যবহার করে এটি কল করতে পারেন।

yourController obj= new yourController();

obj.yourAction();

1
Pfft! আপনি যদি এর পরিবর্তে কোনও ক্রিয়া থেকে ফলাফলের প্রত্যাশা করছেন? var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));
ডার্টিবিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.