@ এইচটিএমএল থেকে অ্যাকশনলিংক এমভিসি 4 থেকে নিয়ামকের কাছে প্যারামিটারটি পাস করুন


109

এই লাইনে:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

আমি ব্লগপোস্টআইডিতে নিম্নলিখিত রানটাইম ত্রুটিটি পেয়েছি:

প্যারামিটারের অভিধানে পদ্ধতিতে 'সিস্টেম. ওয়েবে.এমভিসি.অ্যাকশনারসাল্ট ব্লগেরপ্লাইকমেন্টএড (ইন্ট 32, নোপ.ওয়েব.মোডেলস.ব্লগপোস্টমোডেল, বুলিয়ান)' -র জন্য নন-নলাবল টাইপ 'সিস্টেম.আইন্ট 32' এর প্যারামিটার 'ব্লগপোস্টআইডি'র শূন্য এন্ট্রি রয়েছে' 'Nop.Web.Controllers.BlogController'। একটি alচ্ছিক প্যারামিটার অবশ্যই একটি রেফারেন্স টাইপ, একটি nallable টাইপ, বা alচ্ছিক পরামিতি হিসাবে ঘোষিত হতে হবে। প্যারামিটারের নাম: প্যারামিটার

আমি ইতিমধ্যে শীর্ষে এর জন্য একটি মান নির্ধারণ করেছি

    @{         
        var blogPostId = Model.Id;          
     }

আমার নিয়ামক:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

আমি কি ভুল কিছু করছি? আমাকে একটি উদাহরণ দিন।

উত্তর:


257

আপনি এর একটি ভুল ওভারলোড ব্যবহার করছেন Html.ActionLink । আপনি যা ভাবছেন routeValuesতা আসলে htmlAttributes! কেবল উত্পন্ন এইচটিএমএলটি দেখুন, আপনি দেখতে পাবেন যে এই অ্যাঙ্কারের href সম্পত্তিটি যেমনটি প্রত্যাশিত হিসাবে প্রত্যাশা করে না।

আপনি যা ব্যবহার করছেন তা এখানে:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

এবং আপনার ব্যবহার করা উচিত তা এখানে:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

এছাড়াও আপনার কোড সহ আরও একটি গুরুতর সমস্যা আছে। নিম্নলিখিত রুট মূল্য:

replyblogPostmodel = Model

অ্যাকশনলিঙ্কে আপনি এর মতো জটিল বস্তুগুলি সম্ভবত পাস করতে পারবেন না। সুতরাং এটি থেকে মুক্তি পান এবং BlogPostModelআপনার নিয়ামক পদক্ষেপ থেকে প্যারামিটারটি সরিয়ে দিন remove আপনার ব্যবহার করা উচিতblogPostId পরামিতিটি যেখানেই এই মডেলটি বজায় রয়েছে সেখান থেকে মডেলটি পুনরুদ্ধার করতে, বা যদি আপনি জিইটি অ্যাকশনে মডেলটি পুনরুদ্ধার করেন এমন জায়গা থেকে পছন্দ করেন:

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

যতক্ষণ না আপনার প্রাথমিক সমস্যাটি ভুল ওভারলোডের সাথে সম্পর্কিত, আমি আপনাকে নামকরণকৃত পরামিতিগুলি ব্যবহার করে আপনার সাহায্যকারীদের লেখার পরামর্শ দেব:

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

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


আপনাকে মন্তব্যগুলি পরিবর্তন করতে হবে controllerNameএবংactionName
ওয়েবডিপোপার

@ ডারিনডিমিট্রভ: পরামিতি হিসাবে মডেলটি কীভাবে পাস করবেন?
নেটরাডাব্লু

1
@ দারিনডিমিট্রভ, @ ওয়েবডিপোভার: অ্যাকশনরেসলেটে আমার কি [httpsost] উল্লেখ করার দরকার আছে?
নেত্রসডব্লিউ

@ নেত্রসডব্লিউ, আপনার ক্রিয়াকলাপে থাকা উচিত নয় [HttpPost]কারণ লিঙ্কটি একটি জিইটি অনুরোধ প্রেরণ করছে। [HttpPost]এর অর্থ হল যে আপনার নিয়ামক ক্রিয়াটি কেবলমাত্র একটি পোষ্ট অনুরোধের মাধ্যমে অ্যাক্সেসযোগ্য।
দারিন দিমিত্রভ

@ ডারিনডিমিট্রভ: কীভাবে আমি এই হ্যান্ডেন্ড করতে পারি? মডেল প্রপেসিটির মান খালি প্রেরণ করে। আমাকে গাইড করুন।
নেত্রসডব্লিউ

12

আমাকে দুটি পরামিতি পাস করতে হবে:

/ কন্ট্রোলার / অ্যাকশন / Param1Value / Param2Value

এই পথে:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

এই ইউআরএল উত্পন্ন করবে

/ কন্ট্রোলার / অ্যাকশন / Param1Value? Param2Name = Param2Value

আমি দুটি প্যারামিটারকে দুটি প্যারামিটারে মার্জ করে একটি workaround পদ্ধতি ব্যবহার করেছি এবং আমি যা চেয়েছিলাম তা পেয়েছি:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

এবং আমি পেয়েছি:

/ কন্ট্রোলার / অ্যাকশন / Param1Value / Param2Value


স্পষ্টতই, যখন প্যারাম 1 ভ্যালু নাল হয় তখন এটি ঘটে। আমি সবেমাত্র একই সমস্যার মুখোমুখি হয়েছি।
এফ্র্যাক্ট করুন

3

আপনি নীচে ব্যবহার করে মান পাস করতে পারেন।

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

নিয়ন্ত্রক:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

এবং ইউআরএল দেখতে ভালো লাগে

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay

0

সমস্যাটি অবশ্যই মডেল মানটির সাথে থাকতে হবে d যা শূন্য। আপনি কোনও মান নির্ধারণ করে নিশ্চিত করতে পারেন, যেমন

@{         
     var blogPostId = 1;          
 }

যদি ত্রুটিটি অদৃশ্য হয়ে যায়, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার মডেল আইডির ভিউতে যাওয়ার আগে এটির কোনও মূল্য রয়েছে


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