এমভিসি রেজার গতিশীল মডেল, 'অবজেক্ট' এর মধ্যে 'প্রপার্টি নাম' এর সংজ্ঞা নেই


106

রেজার ভিউ ইঞ্জিন সহ এমভিসি 3 ব্যবহার করা। আমি এই দেখুন:

@model dynamic
@{
    var products = (List<ListItemBaseModel>)Model.Products;
    var threshold = (int)(Model.Threshold ?? 1);
    var id = Guid.NewGuid().ToString();
}

এই কোডটি ব্যবহার করে এটি অন্য ভিউ থেকে কল করা হয়েছে:

@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })

উভয় দর্শনে, যখন আমি সেগুলি ডিবাগ করি এবং মডেল দেখি, মনে হয় এটি সঠিক অবজেক্ট ধারণ করে। যখন আমি কোডটি কার্যকর করি তখন "var পণ্য =" রেখায় আমি একটি ত্রুটি পেয়েছি:

'পণ্য' এর জন্য 'পণ্য' এর সংজ্ঞা নেই

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন আমি সেই ত্রুটিটি পাই? আবার, আমি যখন ডিবাগিং মোডে মডেল অবজেক্টটি দেখি তখন এটি ঠিক আছে (2 টি বৈশিষ্ট্য রয়েছে: পণ্য এবং থ্রেশহোল্ড)


উত্তর:


150

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

// error
return View(new { Foo = 1, Bar = "test" });

// worked
return View(new TestClass { Foo = 1, Bar = "test" });

সম্পাদনা # 1:

ডেভিড এবোর মতে , আপনি একটি বেনামি ধরণের গতিশীল টাইপ করা ভিউতে পাস করতে পারবেন না কারণ বেনামে টাইপগুলি হিসাবে সংকলিত হয় internal। যেহেতু সিএসএইচটিএমএল ভিউটি একটি পৃথক সমাবেশে সংকলিত হয়েছে, এটি বেনামে প্রকারের বৈশিষ্ট্যগুলিতে অ্যাক্সেস করতে পারে না।

সম্পাদনা # 2:

এই স্পষ্টতা দিয়ে ডেভিড এবো তার পোস্ট সম্পাদনা করেছেন:

দ্রষ্টব্য (12/22/2011): এখন যে গতিশীল জন্য এমভিসি 3 সরাসরি সমর্থন আছে, নীচের কৌশলটির আর প্রয়োজন নেই। এই পোস্টটি আসলে এমভিসিতে বৈশিষ্ট্যটি সংহত করার জন্য নেতৃত্ব দিয়েছে!


1
সম্পাদনাটি জেনে ভাল লাগলো। আমার ঠিক একই সমস্যা ছিল এবং আমি ডাব্লুটিএফ বুঝতে পারি নি। ব্যাখ্যার জন্য ধন্যবাদ.
ইয়ানিক রোচন

18
সম্পাদনা # 2 পরামর্শ দেয় যে এখন (এমভিসি> 3) "ত্রুটি" চিহ্নিত করে লাইন করা সম্ভব? return View(new { Foo = 1, Bar = "test" });? কারণ আমি এমভিসি 4 ব্যবহার করছি এবং এখনও "অবজেক্টে ফু এর কোনও সংজ্ঞা নেই"
ক্রীড়া

@ আমাকেও স্পোর্টস ... আপনি কি কোনও কাজের সন্ধান পেয়েছেন? ( ToExpandoএকের পাশে )
অ্যালেক্স

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

41

.NET 4.0 এ বেনামে প্রকারগুলি সহজেই ExpandoObjects এ রূপান্তর করা যায় এবং এইভাবে রূপান্তরটির ওভারহেড দিয়ে সমস্ত সমস্যা সংশোধন করা হয়। পরীক্ষা করে দেখুন এখানে


আপনি স্বাগত জানাই। বেনামে থাকা ধরণের আরও ব্যবহারযোগ্য করে তুলতে এটি এম M কে লাথি মারতে পারে
অ্যাডাপ্টাবী

এটি কি পার্টিয়ালের ক্ষেত্রে প্রযোজ্য? আমি একটি ত্রুটি পেয়েছি যে পার্টিয়ালগুলি ডায়নামিকভাবে প্রেরণ করা যায় না ...
জন বুব্রিসকি

1
কি পার্টিয়াল? আপনি একটি উদাহরণ প্রদান করতে পারেন?
অ্যাডপটাবি

27

অনামিকার ধরণের অভ্যন্তরীণ বৈশিষ্ট্যগুলির সাথে এর কোনও সম্পর্ক নেই

কোনও দৃশ্য থেকে আংশিক দৃশ্যে অজ্ঞাতনামা প্রকারগুলি পাস করা পুরোপুরি সম্ভব

আমি আজ একই সমস্যার মুখোমুখি হয়েছি এবং বেনামে প্রকারভেদ এবং তাদের সহজাত internalসম্পত্তিগুলি পাস করার সমস্যাটি (সরাসরি) কিছুই করার ছিল না ।

যেমন, ওপিএস প্রশ্নের সাথে সম্পর্কিত, @ লুকাশের উত্তর অপ্রাসঙ্গিক - যদিও কাজটি কার্যকর হবে না

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

সুতরাং হঠাৎ ব্যর্থতার কারণে কোনও দৃষ্টিকোণ থেকে কোনও আংশিক অংশে কোনও বেনামি ধরণটি পাস করতে হ'ল কেন?

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

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

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

আপনি এটির দ্বারা আবার ধরা পড়ে না তা নিশ্চিত করার জন্য আপনি এটি আপনার csprojফাইলে যুক্ত করে রেজারের ভিউগুলি সংকলন করতে সক্ষম করতে পারেন :

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

2
এটি আমার সমস্যাটিকে সংশোধন করেছে - "@ মডেল ডায়নামিক" ব্যবহার করা শুরুতে সঠিক ফিক্সের মতো মনে হয়েছিল, তবে আসলে এটি আমাকে ভুল পথে নামিয়েছে।
ক্রিম্বো

আমি সমাধানটি পরিষ্কার করে দিয়েছি, এটি পুনর্নির্মাণ করেছি এবং ত্রুটিটি চলে গেছে up
ম্যাক্সবিউইডইন

এমভিসি 3 থেকে গতিশীল ভিউ মডেলগুলির জন্য এমভিসির সমর্থন প্রতিফলিত করার জন্য আমি আমার উত্তর আপডেট করেছি
লুকাশাস

সময়ে সময়ে ভিউ সংকলন সক্ষম করা বিশাল কোড বেসের জন্য সর্বদা কার্যকর। টি 4 এমভিসি এর সাথে সমস্ত প্রকার সমস্যা, টাইপস, ত্রুটি এটির শক্তিশালী টাইপিংয়ের ধন্যবাদ প্রকাশ করে ইত্যাদি
ডেনিস দ্য মেনেসি

ওহ, ঠিক: আমি সবেমাত্র লক্ষ্য করেছি যে আমরা এখানে একটি দৃশ্য থেকে একটি আংশিক দিকে যাওয়ার কথা বলছি। কোনও নিয়ামক থেকে কোনও দৃশ্যে নয়, যা আমার সমস্যা।
mordm

9

আপনার সমাধানের যে কোনও জায়গায় নিম্নলিখিত ক্লাসটি যুক্ত করুন (সিস্টেমের নেমস্পেস ব্যবহার করুন, সুতরাং এটি কোনও রেফারেন্স যোগ না করেই ব্যবহারের জন্য প্রস্তুত) -

    namespace System
    {
        public static class ExpandoHelper
        {
            public static ExpandoObject ToExpando(this object anonymousObject)
            {
                IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (var item in anonymousDictionary)
                    expando.Add(item);
                return (ExpandoObject)expando;
            }

        }
    }

আপনি যখন মডেলটি ভিউতে প্রেরণ করবেন তখন এটিকে Expando এ রূপান্তর করুন:

    return View(new {x=4, y=6}.ToExpando());

1
প্রথমে একটি গতিশীল অবজেক্ট তৈরি করা এবং তারপরে একটি এক্সপেন্ডোঅবজেক্ট তৈরি করা আমার কাছে একটি অনিচ্ছুক ওভারহেডের মতো মনে হচ্ছে ... কেবল পরিবর্তে ExpandoObject তৈরি করুন ..
Baz1nga

@ বাজ ১ngঙ্গা আপনি পারবেন না ... নতুন এক্সপেন্ডো () {প্রোপ = মান, ... which যা এটি সমস্যাযুক্ত করে। আমি অনুরূপ ব্যবহারের জন্য জসন.নেটের জওবেক্ট ব্যবহার করছি।
ট্র্যাকার 1

3
সেখানে এইচটিএমএল হেল্পার থাকা ভুল বলে মনে হচ্ছে ... পাবলিক স্ট্যাটিক এক্সপেন্ডোঅবজেক্ট টো এক্সপান্ডো (এই অবজেক্ট ও) {আইডিয়োরিয়াল <স্ট্রিং, অবজেক্ট> প্রসারণ = নতুন এক্সপান্ডোঅবজেক্ট (); foreach (ও। গেটটাইপ () মধ্যে পৃথক সম্পত্তি ইনফো। } প্রত্যাবর্তন (ExpandoObject) সম্প্রসারণ; }
এরল্যান্ডো

6

dynamicআংশিক দৃশ্যের মধ্যে মডেল প্রকারটি ব্যবহার করার পরিবর্তে ।

আপনি এর @ViewData.Eval("foo")পরিবর্তে বেনামে অবজেক্ট বৈশিষ্ট্যগুলি কল করতে পারেন @Model.foo

তারপরে আপনি @Model dynamicভিউ থেকে মুছে ফেলতে পারেন ।

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

Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 });

তারপরে আমার দৃষ্টিতে আমার কেবল এই ডিভিশন ছিল:

<div class="fb-comments" data-href="@ViewData.Eval("currentUrl")" data-numposts="@ViewData.Eval("commentCount")" data-width="100%"></div>

0

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


0

আমি অভিধান ব্যবহার করে এই সমস্যাটি নিয়ে কাজ করেছি।

 @Html.Partial("_Partial", new Dictionary<string, string> { { "Key1", "Val1" }, { "Key2", "Val2" }, { "Key3", "Val3" } });

-6

করার জন্য ব্যবহার dynamicটাইপ আপনি উল্লেখ প্রয়োজন Microsoft.CSharpসমাবেশ

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