কিভাবে এএসপি.নেট এমভিসি ফর্মগুলিতে চেকবক্সগুলি হ্যান্ডেল করবেন?


246

সাবধানতা: এই প্রশ্নটি নয় বছরেরও বেশি পুরনো!

আপনার সর্বোত্তম বিকল্পটি হল নতুন প্রশ্ন অনুসন্ধান করা বা নীচের উত্তরগুলি অনুসন্ধান করা আপনার এমভিসির নির্দিষ্ট সংস্করণটি অনুসন্ধান করা, কারণ এখানে অনেক উত্তর এখন অপ্রচলিত।

যদি আপনি এমন কোনও উত্তর খুঁজে পান যা আপনার সংস্করণে কাজ করে তবে দয়া করে নিশ্চিত হয়ে নিন যে উত্তরটিতে আপনি যে এমভিসি ব্যবহার করছেন সেটির সংস্করণ রয়েছে।
(মূল প্রশ্নটি নীচে শুরু হবে)


এটি আমার কাছে কিছুটা উদ্ভট বলে মনে হয় তবে যতদূর আমি বলতে পারি, আপনি এটিই করেন।

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

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

দেখুন মধ্যে:

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

এবং, নিয়ামকটিতে, এই উপায়টিই আমি দেখতে পাচ্ছি যে ব্যবহারকারী কী কী জিনিস পরীক্ষা করেছেন:

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

এটি প্রথম স্থানে নির্লজ্জ এবং দ্বিতীয়ত, ব্যবহারকারীরা পরীক্ষা করে নেওয়া আইটেমগুলির জন্য, ফর্ম সংগ্রহটি তার মানটিকে কেবল সত্যের চেয়ে "সত্য মিথ্যা" হিসাবে তালিকাভুক্ত করে।

স্পষ্টতই, আমি কিছু মিস করছি। আমি মনে করি যে এইচটিএমএল ফর্মের মধ্যে সংগৃহীত বস্তুগুলি ব্যবহার করে আপডেট করা হয়েছে তা মাথায় রেখে এই ধারণাটি তৈরি করা হয়েছেUpdateModel() মডেলবাইন্ডারের বা মাধ্যমে ।

তবে আমার বিষয়গুলি এর জন্য সেট আপ করা হয়নি; তার মানে কি এই একমাত্র উপায়? এটি করার অন্য কোনও উপায় আছে?


2
অন্যরা এই সমাধানটি দরকারী হিসাবে পেতে পারেন: stackoverflow.com/questions/3291501/…
অ্যারন

উত্তর:


262

এইচটিএমএল.চেকবক্স অদ্ভুত কিছু করছে - আপনি যদি ফলাফলের পৃষ্ঠায় উত্সটি দেখেন, আপনি দেখতে পাবেন যে একটি আছে <input type="hidden" /> প্রতিটি চেকবক্সের পাশাপাশি উত্পন্ন হচ্ছে, যা প্রতিটি ফর্মের উপাদানগুলির জন্য "সত্য মিথ্যা" মানগুলি ব্যাখ্যা করে।

এটি ব্যবহার করে দেখুন, যা স্পষ্টতই এএসপি.নেট এমভিসি বিটাতে কাজ করে কারণ আমি এটি চেষ্টা করেছি।

এইচটিএমএল.চেকবক্স () ব্যবহার করার পরিবর্তে ভিউতে রাখুন:

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    <input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
    <%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

আপনার চেকবাক্সগুলি সমস্ত বলা হয় selectedObjectsএবংvalue প্রতিটি চেকবাক্সের মধ্যে সংশ্লিষ্ট অবজেক্টের জিআইডি হয়।

তারপরে নিম্নলিখিত নিয়ন্ত্রক ক্রিয়ায় পোস্ট করুন (বা অনুরূপ কিছু যা প্রতিক্রিয়ার পরিবর্তে দরকারী কিছু করে। রাইট ())

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

এই উদাহরণটি কেবল আপনার পরীক্ষা করা বাক্সগুলির জিআইডিগুলি লিখবে; এএসপি.নেট এমভিসি Guid[] selectedObjectsআপনার জন্য প্যারামিটারে নির্বাচিত চেকবাক্সগুলির জিইউইডি মানগুলি মানচিত্র করে এবং অনুরোধ.ফর্ম সংগ্রহ থেকে স্ট্রিংগুলি তাত্ক্ষণিক জিআইইডি অবজেক্টগুলিতে পার্স করে, যা আমি মনে করি এটি বরং দুর্দান্ত nice


হা! আমার অ্যাপ্লিকেশনগুলির জন্যও আমাকে এই কাজটি করতে হয়েছিল!
অ্যাডিপ গুপ্ত

70
Wtf। নিয়ন্ত্রণ হিসাবে একই নামের সাথে লুকানো ইনপুট ক্ষেত্রগুলি। এর ভিউস্টেট 2.0!
সাইমন_উইভার

3
এটি 1.0 প্রকাশেও উপস্থিত রয়েছে। @ Andrea-Balducci জমা দেওয়া উত্তরটি দেখুন যা আপনাকে এটি মোকাবেলার জন্য একটি বুদ্ধিমান উপায় দেয়। যদি চেকবাক্সটি চেক না করা হয়, ফলাফল প্রাপ্ত পাঠ্যটি 'মিথ্যা মিথ্যা' হওয়া উচিত - এটি মস্তিষ্কের মৃত ব্রাউজারগুলির জন্য অ্যাকাউন্ট করার পক্ষে একটি ভাল কাজ ...
ব্রায়ান রেহাবিন

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

19
@ ওনারগা: আপনি ভুল: একই নামের একাধিক ফর্ম উপাদান থাকা বৈধ এইচটিএমএল; এবং যদি তা হয় তবে সমস্ত উপাদান পোস্ট করা হয়েছে এবং আমি নিশ্চিত নই যে অর্ডারটি আসলে সংজ্ঞায়িত হয়েছে (যদিও অনুশীলনে পৃষ্ঠার ক্রমে কেবল সম্ভবত)। "মিথ্যা" শব্দটিকে মানটি কিছুটা বিভ্রান্তিমূলক হিসাবে ব্যবহার করা, সুতরাং হ্যাঁ, এটি ডব্লিউটিএফ - একটি ভাল, কম বিভ্রান্তিকর পছন্দটি "উপস্থিত" বা ড্যাশের মতো কিছু অর্থহীন টোকেন হতে পারে।
ইমন নারবোনে

95

এইচটিএমএলহেল্প চেক করা স্থিতি সম্পর্কে নিয়ামককে অবহিত করতে একটি লুকানো ইনপুট যুক্ত করে। সুতরাং সঠিক পরীক্ষিত স্থিতি থাকা:

bool bChecked = form[key].Contains("true");

1
এটি এই সমস্যার সবচেয়ে সহজ পদ্ধতির এবং এটি আমি সর্বদা ব্যবহার করি। এটি আপনাকে সহায়তা পদ্ধতি এবং এএসপি.নেট এমভিসিএস আচরণের জন্য অ্যাকাউন্ট ব্যবহার করার অনুমতি দেয়।
নিক ড্যানিয়েলস

8
.. বা ক্ষেত্রে যাচাই না করার ক্ষেত্রে: bool bChecked = form [key]। সমমান ("মিথ্যা"); একটি সত্য। "সত্য, মিথ্যা" হিসাবে কনটেনগুলি ("মিথ্যা") ব্যর্থ হয়।
মার্ক রবিনসন

54

আপনি যদি ভাবছেন যে কেন তারা চেকবাক্সের একই নামের সাথে একটি গোপন ক্ষেত্র রেখেছিল কারণটি নিম্নরূপ:

Sourcecode MVCBetaSource \ MVC \ src \ MvcFutures \ MVC \ থেকে মন্তব্য ButtonsAndLinkExtensions.cs

<input type="hidden".../>চেকবাক্সগুলির জন্য অতিরিক্ত রেন্ডার করুন। এটি এমন পরিস্থিতিগুলিকে সম্বোধন করে যেখানে অনুরোধে চেকবিহীন চেকবক্সগুলি প্রেরণ করা হয় না। একটি লুকানো ইনপুট প্রেরণ এটি জানা সম্ভব করে দেয় যে অনুরোধটি জমা দেওয়ার সময় পৃষ্ঠায় চেকবক্সটি উপস্থিত ছিল।

কন্ট্রোলার অ্যাকশন পদ্ধতিতে পরামিতিগুলির সাথে আবদ্ধ করার জন্য তাদের এগুলি জানতে পর্দার পিছনে আমার ধারণা। তারপরে আপনার মনে হয় ত্রি-রাষ্ট্রীয় বুলিয়ান আমি ধরে নিতে পারি (একটি nullable bool প্যারামিটারে আবদ্ধ)। আমি এটি চেষ্টা করি নি তবে আমি আশা করি তারা কী করেছে।


4
হ্যাঁ এটি এমন পরিস্থিতিতে তৈরি করা সহজ যেখানে আপনার গ্রিড ইত্যাদি রয়েছে এবং আপনি কিছু আইটেম বেছে নিতে চান যা আগে কোনও ব্যবসায়ের উদ্দেশ্যে নির্বাচিত হয়েছিল।
রিচার্ডড

49

আপনার ব্যবহারও করা উচিত <label for="checkbox1">Checkbox 1</label>কারণ এরপরে লোকেরা লেবেল পাঠ্যের পাশাপাশি চেকবক্সেও ক্লিক করতে পারে। এটি স্টাইল করাও সহজ এবং অন্তত আইই তে এটি হাইলাইট হবে যখন আপনি পৃষ্ঠার নিয়ন্ত্রণগুলির মাধ্যমে ট্যাব করবেন।

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

এটি কেবল 'ওহ আমি এটি করতে পারি' জিনিস নয়। এটি একটি উল্লেখযোগ্য ব্যবহারকারীর অভিজ্ঞতা বৃদ্ধি। এমনকি যদি সমস্ত ব্যবহারকারী জানেন না তবে তারা লেবেলে ক্লিক করতে পারেন অনেকগুলি will


27

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

আমি এ সম্পর্কে এখানে একটি ব্লগ পোস্ট লিখেছি , যা এমনকি লেবেলগুলিকে চেকবক্সে লিঙ্ক করে। আমি এডিটরটিম্পলেট ব্যবহার করেছি একটি পরিষ্কার এবং মডুলার উপায়ে সম্পন্ন করার জন্য ফোল্ডারটি ।

আপনি সহজেই এডিটর টেম্পলেট ফোল্ডারে একটি নতুন ফাইলটি দেখতে পাবেন যা দেখতে এটির মতো দেখায়:

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

আপনার আসল দৃষ্টিতে, এটিকে লুপ করার দরকার হবে না, কেবল কোডের 1 লাইন:

@Html.EditorFor(x => ViewData.Model)

আরও তথ্যের জন্য আমার ব্লগ পোস্ট দেখুন।


1
ধন্যবাদ! এভারবয়েড এখনও পুরানো ফর্মগুলি ব্যবহার করে। এবং আপনি জমা দেওয়ার সময় আপনি এই সমস্ত সংগ্রহ ছাড়াই মডেলটিতে অ্যাক্সেস করতে পারবেন [] এবং অনুরোধ করুন form +1এবং + বিয়ার
পাইোটার কুলা

2
এটি প্রশ্নের উত্তর হতে হবে। খুব সহজ এবং কার্যকর করা সহজ।
জোহান গুণওয়ান

আমি এই উত্তরটি খুঁজে পাওয়ার আগে এর মার্জিত সমাধান খুঁজতে কিছু সময়ের জন্য সংগ্রাম করেছি। এটি কয়েক বছরের পুরানো তবে এখনও 2016 সালে পুরোপুরি বৈধ! যদি বেশ কয়েকটি ক্ষেত্রে ব্যবহার করে থাকেন তবে বিল্ট-ইন সিলেক্টলিস্ট আইটেমটিকে জেনেরিক টাইপ হিসাবে ব্যবহার করুন যা এটির জন্য পুরোপুরি উপযুক্ত
ফিল

স্যাম্পলওজেক্ট কি একটি তালিকা? যেমন: @ মডেলটাইপ তালিকা (প্রকারের)
JoshYates1980

25

আমি যা করছিলাম তা এখানে।

দেখুন:


<input type="checkbox" name="applyChanges" />

নিয়ন্ত্রক:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

আমি এইচটিএমএলকে পেয়েছি methods এটি তাদের মধ্যে একটি হওয়ায় অন্য যেটি মনে আসে তা হ'ল রেডিও বোতাম।

সম্পাদনা করুন: এটি পূর্বরূপ 5 এ রয়েছে, স্পষ্টতই সংস্করণগুলির মধ্যে ওয়াইএমএমভি।


1
আমি কেবল একটি বিকল্প উদাহরণ যুক্ত করতে চাই: অবজেক্ট.প্রপার্টি =! স্ট্রিং.আইএসএন নলআরম্পিটি (অনুরোধ.ফর্ম ["NAME"]);
Gup3rSuR4c

যদি চেক না করা থাকে তবে এটি ব্যতিক্রম হয়
জুলফি

10

তারা কেবল প্রথম মানটি পড়ার বিকল্প হিসাবে উপস্থিত হবে বলে মনে হয়, তাই যদি চেকবক্সটি চেক করা হয় তবে এটি "সত্য" এবং যখন কেবল লুকানো মান অন্তর্ভুক্ত থাকে তখন "মিথ্যা"। এটি সহজে কোডগুলির সাথে সহজেই এনে দেওয়া হয়:

model.Property = collection["ElementId"].ToLower().StartsWith("true");

8

@ ডিলান বিটি গ্রেট সন্ধান করুন! আমি আপনাকে অনেক ধন্যবাদ। আরও প্রসারিত করতে, এই কৌশলটি ভিউ মডেল পদ্ধতির সাথে নিখুঁতভাবে কাজ করে। এমভিসি এত দুর্দান্ত, ভিউতে আবদ্ধ মডেল অবজেক্টের একই নামে কোনও সম্পত্তিতে গাইডের একটি অ্যারে বাঁধাই যথেষ্ট স্মার্ট। উদাহরণ:

ViewModel:

public class SampleViewModel
{
    public IList<SampleObject> SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

    public class SampleObject
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}

দেখুন:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
    <thead> 
        <tr>
            <th>Checked</th>
            <th>Object Name</th>
        </tr>
    </thead> 
<% using (Html.BeginForm()) %>
<%{%>                    
    <tbody>
        <% foreach (var item in Model.SampleObjectList)
           { %>
            <tr>
                <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
                <td><%= Html.Encode(item.Name)%></td>
            </tr>
        <% } %>
    </tbody>
</table>
<input type="submit" value="Submit" />
<%}%>                    

নিয়ন্ত্রক:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SampleView(Guid id)
    {
        //Object to pass any input objects to the View Model Builder 
        BuilderIO viewModelBuilderInput = new BuilderIO();

        //The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
        SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);

        return View("SampleView", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SampleView(SampleViewModel viewModel)
    {
        // The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
        return View();
    }

মডেল দর্শনের সাথে পরিচিত যে কেউ আনন্দিত হবে, এটি চ্যাম্পের মতো কাজ করে!


ধন্যবাদ, আপনার নমুনাভিউ মডেলটি মূল উত্তরে কিছু বিভ্রান্তি পরিষ্কার করেছে।
সংসদ

6

আমি আরও উল্লেখ করতে চাই যে আপনি প্রতিটি চেকবক্সের নাম আলাদা আলাদা রাখতে পারেন, এবং সেই নামটি অ্যাকশনারসাল্ট পরামিতিগুলির অংশ থাকতে পারেন।

উদাহরণ,

দেখুন:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422

নিয়ন্ত্রক:

public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
    ...
}

নামগুলি একই হওয়ায় ভিউ থেকে মানগুলি অ্যাকশনে প্রেরণ করা হয়।

আমি জানি যে এই সমাধানটি আপনার প্রকল্পের জন্য আদর্শ নয়, তবে আমি ভেবেছিলাম যে আমি এই ধারণাটি সেখানে ফেলে দেব।


5
<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>

নিয়ামক থেকে:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection fc)
    {

         var s = fc["checkbox1"];

         if (s == "on")
         {
             string x = "Hi";
         }
    }

4

এই ইস্যুটি প্রকাশের 1.0 তেও ঘটছে। এইচটিএমএল.চেকবক্স () এর ফলে আপনার মূল চেকবক্সের মতো একই নাম / আইডির সাথে অন্য একটি লুকানো ক্ষেত্র যুক্ত হতে পারে। এবং আমি যখন ডকুমেন্টটি ব্যবহার করে একটি চেকবক্স অ্যারে লোড করার চেষ্টা করছিলাম .GetElemtentsByName (), আপনি অনুমান করতে পারেন কীভাবে জিনিসগুলি গোলমাল হয়ে উঠছিল। এটি একটি উদ্ভট।


4

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

 $('input[type="checkbox"]').each(function () {
       $(this).attr('value', $(this).is(':checked'));
 }); 

এইভাবে, আপনার চেকবাক্সের মান সংরক্ষণ করার জন্য কোনও লুকানো উপাদান দরকার নেই।


4

আমি জানি যে এমভিসি 3 আউট না হওয়ার সময় এই প্রশ্নটি লেখা হয়েছিল, তবে যে কেউ এই প্রশ্নে আসে এবং এমভিসি 3 ব্যবহার করছে, আপনি এটি করার জন্য "সঠিক" উপায়টি পেতে পারেন।

আমি মনে করি যে পুরো করছেন

Contains("true");

জিনিসটি দুর্দান্ত এবং পরিষ্কার, এবং সমস্ত এমভিসি সংস্করণে কাজ করে, সমস্যাটি হ'ল সংস্কৃতিটিকে বিবেচনায় নেয় না (যেন এটি কোনও বুলের ক্ষেত্রে সত্যই গুরুত্বপূর্ণ)।

কমপক্ষে এমভিসি 3 এ একটি বুলের মূল্য বের করার "সঠিক" উপায়টি হল ভ্যালুপ্রোভিডার ব্যবহার করা।

var value = (bool)ValueProvider.GetValue("key").ConvertTo(typeof(bool));

আমি অনুমতিগুলি সম্পাদনা করার সময় আমার ক্লায়েন্টের একটি সাইটে এটি করি:

var allPermissionsBase = Request.Params.AllKeys.Where(x => x.Contains("permission_")).ToList();
var allPermissions = new List<KeyValuePair<int, bool>>();

foreach (var key in allPermissionsBase)
{
     // Try to parse the key as int
     int keyAsInt;
     int.TryParse(key.Replace("permission_", ""), out keyAsInt);

     // Try to get the value as bool
     var value = (bool)ValueProvider.GetValue(key).ConvertTo(typeof(bool));
}

এখন, এর সৌন্দর্যটি হ'ল আপনি এটি যে কোনও সাধারণ প্রকারের সাথে ব্যবহার করতে পারেন এবং এটি সংস্কৃতি (অর্থ, দশমিক ইত্যাদি ভাবেন) এর উপর ভিত্তি করে সঠিকও হবে।

আপনি যখন নিজের ক্রিয়াগুলি এইভাবে তৈরি করেন তখন ভ্যালুপ্রোভিডারটি ব্যবহৃত হয়:

public ActionResult UpdatePermissions(bool permission_1, bool permission_2)

তবে আপনি যখন এই তালিকাগুলি গতিশীলভাবে তৈরি করতে এবং মানগুলি পরীক্ষা করার চেষ্টা করছেন তখন আপনি কখনই সংকলনের সময় আইডিটি জানতে পারবেন না, তাই আপনাকে এগুলি ফ্লাইতে প্রক্রিয়া করতে হবে।


আপনি কি অনুরোধটি ব্যবহার করার কোনও কারণ আছে? পদ্ধতিতে একটি ফর্মকলাকরণ প্যারামিটার যুক্ত করার পরিবর্তে প্যারাম?
সুইস কোডার

কোনও কারণ নেই, আমি অন্যভাবে কোনও উপায়ে সত্যই দেখছি না।
ড্যান ভ্যানউইঙ্কল

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

হ্যাঁ আমি এমভিসিতে নতুন। এবং আমি কোথাও পড়েছি যে অনুরোধের পরিবর্তে ফর্ম সংগ্রহ সংগ্রহ করা আরও ভাল ara আমি লক্ষ্য করেছি যে কোডের অন্যান্য জিনিসগুলি অল পার্মিশন ভেরিয়েবল এবং কীএএসআইন্টের মতো ব্যবহৃত হয় না। উত্তর করার জন্য ধন্যবাদ.
সুইসকোডার

3

সবচেয়ে সহজ উপায় হ'ল ...

আপনি নাম এবং মান সেট করেছেন।

<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name

তারপরে জমা দেওয়ার পরে চেকবাক্সগুলির মানগুলি ধরুন এবং একটি বিন্যাসে সংরক্ষণ করুন। তারপরে উপযুক্ত লিনকিউ ফাংশন। এটাই..

[HttpPost]
        public ActionResult Checkbox(int[] selectedObjects)
        {
            var selected = from x in selectedObjects
                           from y in db
                           where y.ObjectId == x
                           select y;                   

            return View(selected);
        }

3

নটিক ২০ এর উত্তর হিসাবে একই, কেবলমাত্র ভিভিমোডলে স্ট্রিং / ইনট / এনামের সংগ্রহের সম্পত্তি হিসাবে একই নামে এমভিসি ডিফল্ট মডেল বাইন্ডিং চেকবক্স তালিকাটি ব্যবহার করুন। হ্যাঁ, ওটাই.

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

নিম্নলিখিত কোডটি মডেল বাইন্ডিংয়ের জন্য কাজ করবে:

 <% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
 <% } %>

নিম্নলিখিত কোডগুলি মডেলকে বাধ্যতামূলক করবে না (প্রতিটি চেকবক্সের জন্য এটি এখানে আইডি নির্ধারিত হয়)

<% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
<% } %>

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

আমি দ্বিতীয় যে. অনন্য আইডি অপসারণ করা এই সমস্যাটি অনেক মাথা ব্যথার পরে এবং দাঁতে দাঁত ঘষে দেওয়ার পরে সমাধান করেছে
অডি

আমি যে এমভিসি ব্যবহার করছি তার সংস্করণটি এই ইস্যুটির জন্য। নেট এমভিসি 4.0।
চায়নাহেলো ওয়ার্ল্ড

2

এইচটিএমএল.চেকবক্স ব্যবহার করার সময় আমি দ্বিগুণ মানগুলি আলগা করতে চেয়েছিলাম (...

Replace("true,false","true").Split(',')

4 টি বাক্স চেকড, চেক না করা, চেক না করা, যাচাই করে এটি সত্য, মিথ্যা, মিথ্যা, মিথ্যা, সত্য, মিথ্যাটিকে সত্য, মিথ্যা, মিথ্যা, সত্যে পরিণত করে। ঠিক যেটা আমার দরকার ছিল


0

কিভাবে ভালো কিছু সম্পর্কে?

bool isChecked = false;
if (Boolean.TryParse(Request.Form.GetValues(”chkHuman”)[0], out isChecked) == false)
    ModelState.AddModelError(”chkHuman”, Nice try.”);

0

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

সুতরাং একটি 'পরীক্ষিত' বা সত্য পরীক্ষা করা হ'ল:

//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 

একটি মিথ্যা চেক করা হবে:

//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 

মূল পার্থক্য হ'ল GetValuesএই অ্যারে হিসাবে এই রিটার্ন হিসাবে ব্যবহার করা।


0

শুধু এটির উপর $(document).ready:

$('input:hidden').each(function(el) {
    var that = $(this)[0];
    if(that.id.length < 1 ) {

        console.log(that.id);
        that.parentElement.removeChild(that);

    }
});

2
দুর্ভাগ্যক্রমে, আপনি জাভাস্ক্রিপ্ট বন্ধ হওয়া লোকদের জন্য সার্ভার সাইডে অদ্ভুত ফলাফল পেতে পারেন (নোস্ক্রিপ্ট প্লাগ-ইন, পুরানো মোবাইল ফোনগুলি,
লিংক

0

আমার সমাধানটি হ'ল:

<input type="checkbox"  id="IsNew-checkbox"  checked="checked" />     
<input type="hidden"  id="IsNew" name="IsNew" value="true"  />      
<script language="javascript" type="text/javascript" >     
  $('#IsNew-checkbox').click(function () {    
      if ($('#IsNew-checkbox').is(':checked')) {    
          $('#IsNew').val('true');    
      } else {    
          $('#IsNew').val('false');    
       }    
  });   
</script>  

আরও আপনি এখানে পেতে পারেন: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognised-as-a- বৈধ-বুলিয়ান /


এর জন্য আপনার কোনও জাভাস্ক্রিপ্ট ব্যবহার করার দরকার নেই ... var isChecked = formData [key] .Contains ("true");
জামার

0

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

একটি সাধারণ সমাধান পেয়েছে তবে এটি কিছুটা মোটামুটি মনে হচ্ছে।

টাইপ করার চেষ্টা করুন Viewbag.আপনার নিয়ামকটি এবং এখন আপনি এটির মতো একটি নাম দিনViewbag.Checkbool

এখন ভিউতে স্যুইচ করুন এবং এটি ব্যবহার করে দেখুন @Viewbag.Checkbool দিয়ে আপনি কন্ট্রোলারের কাছ থেকে মানটি পাবেন।

আমার নিয়ামক পরামিতিগুলি এর মতো দেখতে:

public ActionResult Anzeigen(int productid = 90, bool islive = true)

এবং আমার চেকবক্সটি এটির মতো আপডেট হবে:

<input id="isLive" type="checkbox" checked="@ViewBag.Value" ONCLICK="window.location.href = '/MixCategory/Anzeigen?isLive=' + isLive.checked.toString()" />

0

@ এমমাকাউলে ব্যবহার করে আমি এটি নিয়ে এসেছি:

// MVC Work around for checkboxes.
bool active = (Request.Form["active"] == "on");

যদি সচল থাকে তবে = সত্য

যদি চেক না করা থাকে সক্রিয় = মিথ্যা

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