নাল মডেলের সাথে রেন্ডারপার্টিয়াল ভুল টাইপটি পাস করে


198

আমার একটি পৃষ্ঠা আছে:

<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>

এবং এটিতে, নিম্নলিখিত:

<% Html.RenderPartial("TaskList", Model.Tasks); %>

এখানে ডিটিও অবজেক্টটি রয়েছে:

public class DTOSearchResults
{
    public string SearchTerm { get; set; }
    public IEnumerable<Task> Tasks { get; set; }

এবং এখানে আংশিক:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>

যখন মডেল.টাস্কগুলি শূন্য হয় না, সবকিছু ঠিকঠাক করে। তবে আমি যখন এটি বাতিল করব তখন:

অভিধানে পাস হওয়া মডেল আইটেমটি 'ডিটিওএস সার্চ রেজাল্টস' টাইপের তবে এই অভিধানটিতে 'সিস্টেম.কলেশনস.জেনেরিক.আইইউনামারেবল `১ [টাস্ক]' টাইপের একটি মডেল আইটেমের প্রয়োজন।

আমি বুঝতে পেরেছিলাম যে কোন ওভারলোডটি ব্যবহার করা উচিত তা অবশ্যই জানতে হবে না, তাই স্পষ্ট হওয়ার জন্য আমি এটি (নীচে দেখুন) করেছি, তবে আমি এখনও একই সমস্যা পেয়েছি!

<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>

আমি জানি আমি নাল পরীক্ষা করে, বা এমনকি নাল পাস না করেও এটিকে ঘিরে কাজ করতে পারি, তবে এটি বিন্দু নয়। এটি কেন ঘটছে?

উত্তর:


349

অ্যান্ড্রু আমি মনে করি আপনি যে সমস্যাটি পাচ্ছেন তা হ'ল রেন্ডার পার্টিশিয়াল পদ্ধতির ফলস্বরূপ কলিং (ভিউ) এর মডেলটিকে আংশিক দৃশ্যে ব্যবহার করার সময় যখন আপনি পাশ করেন সেই মডেলটি শূন্য হয় .. আপনি এই অদ্ভুত আচরণটি ঘটাতে পারেন:

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %>

এটা কি সাহায্য করে?


16
এখনও মানুষের সময় বাঁচাচ্ছে। আমি এই উপর আমার চুল টান ছিল।
জেমস গ্রেগরি

3
তারা কেন নাল মডেলকে সমর্থন করে এবং পৃষ্ঠাগুলি মডেলগুলি পাশ করে কেন তা তারা ওভারলোড করে তা পরিচালনা করতে পারেনি। @ Html.Render ( "গাধার") @ Html.Render ( "গাধার", couldbenull) চেয়ে ভিন্ন
ফিল স্ট্রং

19
আমি এটিকে খুব বিপরীতমুখী মনে করি তাই আমি একটি "ইস্যু" যুক্ত করেছি, আপনি যদি রাজি হন তবে এটিতে ভোট দিন: aspnet.codeplex.com/workitem/8872
pbz

3
আমি দেখতে পেয়েছি যে এই সমাধানের সাথে আমার আংশিক দৃষ্টিভঙ্গিতে আমার ভ্যালিডেশনস্মুলি কাজ করে না কারণ প্রাথমিক মডেলের ভিউডাটা আংশিক দৃশ্যে হারিয়ে গেছে। এটি সমাধান করতে আমি এখানে দেওয়া উত্তরটি stackoverflow.com/a/12037580/649497 ব্যবহার করেছি ।
ব্রুসহিল

5
আপনার বিদ্যমান ভিউডেটা বরাবর পাস করা উচিত: নতুন ভিউডাটাডেটের অভিধান (ভিউডাটা)
স্কট

48

@ মায়ানডমাইকোডের উত্তরটি ভাল, তবে কিছুটা ছোট হবে

<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %>

এটি কাজ করে কারণ ViewDataDictionaryমডেলটি হ'ল জিনিসটি, এবং এটি কোনও মডেলটিকে কনস্ট্রাক্টর পরামিতি হিসাবে গ্রহণ করতে পারে। এটি মূলত একটি "সম্পূর্ণ" দেখুন ডেটা অভিধানকে পাস করে, যা অবশ্যই সম্ভবত সম্ভাব্য-নাল মডেল ধারণ করে।


2
@ জেএমসিবিবেথ: আর্ম, না, এটি হয় না ... আমি নালগুলির সাথে এই সঠিক কোডটি সফলভাবে ব্যবহার করেছি।
Configurator

1
@ জেএমসিবিবেথ: আপনি কি ব্যবহার করছেন new ViewDataDictionary(null)? কারণ এটি একটি পৃথক ওভারলোড চয়ন করবে, একটি ViewDataDictionaryপ্যারামিটার সহ একটি , যা সম্ভবত নাল গ্রহণ করবে না।
Configurator

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

1
@ জেএমসিবিবেথ: ডায়নামিক ধরণের মাধ্যমে এটি কল করা একইভাবে ব্যবহার করে যেমন আপনি প্রকৃত মান দিয়েছেন; মানটি যদি হয় তবে এটি nullকল করার মতোই new ViewDataDictionary(null)যা সর্বাধিক নির্দিষ্ট ওভারলোডকে ডেকে আনে।
Configurator

1
আপনি যদি এটির মতো ব্যবহার করেন তবে ডিকশনারি ত্রুটি চলে গেছে .. Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))আপনি যদি ভুল নির্মাতা এটির নালাগুলি ব্যবহার করেন।
ফিলিপ কর্নেলিসসেন

26

দেখা যাচ্ছে যে আপনি যে মডেলটির মধ্য দিয়ে যাচ্ছেন তার সম্পত্তি যখন নষ্ট হয় এমভিসি ইচ্ছাকৃতভাবে "প্যারেন্ট" মডেলটিতে ফিরে আসে। দৃশ্যত এমভিসি ইঞ্জিন পূর্ববর্তীটি ব্যবহারের অভিপ্রায় হিসাবে নাল মডেল মানটিকে ব্যাখ্যা করে।

সামান্য আরও বিশদ এখানে: ASP.NET এমভিসি, দৃ strongly়ভাবে টাইপ করা ভিউ, আংশিক দেখুন প্যারামিটারগুলি ভুল


1
ইস্যুটি ব্যাখ্যা করার চেষ্টা করার জন্য, এবং এটি কেবল একটি উদ্ভট আচরণ হিসাবে দেখানোর জন্য +1
YavgenyP

হ্যাঁ এটি আমার সাথে ঘটছিল এবং উপরেরগুলি এটি ঠিক করে নি, এটি আমার আসল ত্রুটি সম্পর্কে আমাকে আরও কিছুটা তথ্য দিয়েছে।
ক্যানভাস

20

আপনি যদি নিজের পূর্ববর্তী ভিউডাটা আংশিক দৃশ্যে আলগা না করতে চান তবে আপনি চেষ্টা করতে পারেন:

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>

1
এটি প্রশ্নের উত্তর বলে মনে হচ্ছে না।
জন স্যান্ডার্স

6
+1 আসলে এটি কাজ করে। এটি মূলত এখানে উপস্থাপন একই ধারণা stackoverflow.com/a/713921/649497 কিন্তু যে উত্তর একটি সমস্যা overcomes এবং যে ViewData অনুপস্থিত যেতে হবে যদি আপনি একটি খালি কন্সট্রাকটর সঙ্গে ViewDataDictionary instantiate হয়। আমি প্রথমে গৃহীত সমাধান দিয়ে এই সমস্যাটি সমাধান করেছি এবং তারপরে দেখতে পেয়েছি যে আমার ভ্যালিডেশনস্মারীটি আংশিক দৃষ্টিতে কাজ করে না। এই সমাধানটি আমার জন্য সমাধান করেছে। সমস্যাটি সমাধান করার জন্য এবং আপনার আংশিক দৃষ্টিতে ভিউডাটা সংরক্ষণের জন্য এই উত্তরের আরও স্বীকৃতি দরকার।
ব্রুসহিল

1
@ ফ্র্যাঙ্ক পি এটি ভিউব্যাগের মানগুলি না হারিয়ে আসলেই কাজ করেছে এবং তাই একটি নাল মডেলটি পাস করেছে। ধন্যবাদ।
যাকের

আপনার পার্টিয়ালগুলিতে ভিউব্যাগ অ্যাক্সেসের প্রয়োজন হলে এটি সঠিক উত্তর!
ড্যানিয়েল লরেঞ্জ

12

একটি সমাধান হ'ল এটির মতো এইচটিএমএলহেলপার তৈরি করা:

public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model)
{
    ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData)
    {
        Model = model
    };
    return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData);
}

Partial<T>(...)সামনে মিলেছে Partial(...)তাই সুবিধাজনক এবং কোন অস্পষ্টতা ত্রুটি সংকলন।

ব্যক্তিগতভাবে আমার আচরণটি বুঝতে অসুবিধা হয় - এটিকে ডিজাইন পছন্দ হিসাবে কল্পনা করা শক্ত বলে মনে হয়?


1
এই আমি শেষ পর্যন্ত কি। অ্যাপনেট এমভিসি-তে কোনও নকশার পছন্দ / আচরণ নেই যা কোনও ধারণা দেয়। যেহেতু এটি পরিত্যাজ্য। অন্যদের জন্য সহায়ক, সুতরাং একটি +1 করুন
অ্যান্ড্রু বুলক

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

11

যদিও এর উত্তর দেওয়া হয়েছে, আমি এটি পেরিয়ে গিয়েছিলাম এবং সিদ্ধান্ত নিয়েছি যে আমি এই সমস্যাটি আমার কাজটির পরিবর্তে কাজ করার পরিবর্তে আমার প্রকল্পের জন্য সমাধান করতে চাই new ViewDataDictionary()

আমি এক্সটেনশন পদ্ধতির একটি সেট তৈরি করেছি: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
আমি এমন কিছু পদ্ধতিও যুক্ত করেছি যা মডেলটি শূন্য থাকলে আংশিক বলে না , এটি বিবৃতি যদি অনেক সংরক্ষণ করবে।

আমি এগুলি রেজারের জন্য তৈরি করেছি, তবে তাদের মধ্যে কয়েকজনের এসপেক্স স্টাইলের মতামতের সাথেও কাজ করা উচিত (যেগুলি হেল্পার রেজাল্ট ব্যবহার করে তারা সম্ভবত সামঞ্জস্যপূর্ণ নয়)।

এক্সটেনশন পদ্ধতিগুলি দেখতে এইরকম:

@* calls the partial with Model = null *@
@Html.PartialOrNull("PartialName", null)
@* does not call the partial if the model is null *@
@Html.PartialOrDiscard("PartialName", null)

এর জন্যও পদ্ধতি রয়েছে IEnumerable<object>মডেলগুলির ফেলে দেওয়াগুলিকে একটি রেজার ল্যাম্বডা দিয়েও ডেকে আনা যায় যা আপনাকে কিছু এইচটিএমএল দিয়ে আংশিক ফলাফলটি মোড়ানোর অনুমতি দেয়।

আপনি যদি পছন্দ করেন তবে নির্দ্বিধায় এগুলি ব্যবহার করুন।


1
এমভিসি 5: 6/25/2014 হিসাবে এখনও কার্যকর। ধন্যবাদ।
জেসন

1

এটি সম্পর্কে আমার কাজটি হ'ল:


<% Html.RenderPartial("TaskList", Model.Tasks ?? new List()); %>


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