এএসপি.নেট এমভিসি 4 এ চেকবাক্সের মান পাওয়া


122

আমি একটি এএসপি.এনইটি এমভিসি 4 অ্যাপে কাজ করছি। এই অ্যাপ্লিকেশনটির একটি প্রাথমিক ফর্ম রয়েছে। আমার ফর্মের মডেলটি নীচের মত দেখাচ্ছে:

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

আমার ফর্মটিতে, আমি নিম্নলিখিত এইচটিএমএল আছে।

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

আমি যখন ফর্মটি পোস্ট করি তখন মডেলটির মনে রাখার মানটি সর্বদা মিথ্যা। যাইহোক, মডেলটিতে নামের বৈশিষ্ট্যের একটি মান রয়েছে। আমি নিম্নলিখিতটিতে একটি ব্রেকপয়েন্ট সেট করে এটি পরীক্ষা করেছি:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

আমি এটা বুঝতে পারি না। চেকবাক্স মান সেট হচ্ছে না কেন?


এটি কি সঠিক মান সহ পোস্ট হয়? আপনি কি ফিজার ব্যবহার করে তা পরীক্ষা করতে পারেন? এছাড়াও, আমি জানি না / কীভাবে চেকবক্সের মান বুলিতে অনুবাদ করে।
শাহকল্পেশ

এটি ফর্মটিতে "চালু" বা "অফ" হিসাবে পোস্ট হবে। এটি দৃশ্যত সঠিক বাঁধাই করে না। আমি এড়াতে বোকা এনাম বানিয়েছি।
ইয়াবলারগো

ইয়াবলারগো, আপনার এনামের দরকার নেই ইনপুট ট্যাগে মান = "সত্য" যুক্ত করুন। এবং নীচের হিসাবে মান = "মিথ্যা" সহ একটি লুকানো ব্যবহার করুন।
সহানুভূতিশীল গ্রেগ

উত্তর:


213
@Html.EditorFor(x => x.Remember)

উত্পন্ন হবে:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

এটা কিভাবে কাজ করে:

  • যদি checkbox যাচাই না করা হয়, ফর্মটি কেবল hiddenমান জমা করে (মিথ্যা)
  • যদি চেক করা থাকে তবে ফর্মটি দুটি ক্ষেত্র জমা দেয় (মিথ্যা এবং সত্য) এবং এমভিসি trueমডেলের boolসম্পত্তির জন্য সেট করে

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

এটি চেক করা থাকলে সর্বদা ডিফল্ট মান প্রেরণ করবে।


7
হাই, এই আচরণটি আমার মডেলকে বৈধতা ব্যর্থ করে তোলে কারণ এটি [সত্য, মিথ্যা] কীভাবে একক বুলিয়ান মানকে রূপান্তর করতে পারে তা নির্ধারণ করতে সক্ষম হবে বলে মনে হয় না। আপনি কিভাবে এই চারপাশে কাজ করবেন?
ওবি

@ ওবিওনুরাহ আপনি কোন নির্মাণ ব্যবহার করছেন? সহায়ক বা হার্ড-কোডেড এইচটিএমএল মার্কআপ?
ওয়েবডিপোপার

5
এইচটিএমএল.এডিটর বা এইচটিএমএল.চেকবক্সফোর্ড একই ফল দেয়
ওবি

3
যদি ফর্ম সংকলন ব্যবহার করা হয়, তবে ফলাফলটি হিসাবে স্ট্রিংটি চেকবক্সের জন্য ফিরে এসেছে: "সত্য, মিথ্যা"। আপনি এই পার্স কিভাবে? প্রতিস্থাপন () কি একমাত্র বিকল্প?
জো স্মু

7
আপনি যদি নিজের চেকবক্সগুলি ম্যানুয়ালি যোগ করে থাকেন তবে মূল অংশটি হ'ল মানটি "সত্য" হিসাবে সেট করা উচিত , অন্যথায় ফর্মটি ফিরে পাওয়া ডিফল্ট মানটি "চালু" হবে এবং "অন" একটি বুলের সাথে আবদ্ধ হতে পারে না যা সত্য / মিথ্যা প্রয়োজন। (আপনি একটি বৈধতা ত্রুটি দেখতে পাচ্ছেন যে "অন" মানের ক্ষেত্রে ক্ষেত্রের জন্য বৈধ নয় ))
গ্রেগ

69

যেহেতু আপনি মান সেট করতে Model.Name ব্যবহার করছেন। আমি ধরে নিই আপনি ভিউতে খালি ভিউ মডেলটি দিচ্ছেন।

সুতরাং মনে রাখার মানটি মিথ্যা এবং চেকবক্সের উপাদানটির মানটিকে মিথ্যা হিসাবে সেট করে। এর অর্থ হ'ল আপনি যখন চেকবক্সটি নির্বাচন করবেন তখন আপনি ফর্মটির সাথে "মিথ্যা" মানটি পোস্ট করছেন। আপনি যখন এটি নির্বাচন করবেন না, এটি পোস্ট হয় না, সুতরাং মডেলটি মিথ্যা হিসাবে ডিফল্ট হয়। যে কারণে আপনি উভয় ক্ষেত্রেই একটি ভুয়া মান দেখছেন।

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

@Html.CheckBoxFor(x => x.Remember)

বা আপনি যদি মডেলটিকে দৃশ্যের সাথে আবদ্ধ করতে চান না।

@Html.CheckBox("Remember")

এমভিসি একটি গোপন ক্ষেত্র সহ কিছু যাদু করে যখন মান নির্বাচন করা হয় না।

সম্পাদনা করুন, যদি আপনার যদি এটি করতে সত্যিই বিরক্তি থাকে এবং উপাদানটি নিজে তৈরি করতে চান তবে আপনি করতে পারেন।

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />

2
@Html.CheckboxForকোড আসলে হওয়া উচিত@Html.CheckBoxFor
fujiiface

আপনি কেবল একটি @(Model.Remember ? "checked=\"checked\"" : "")রেডিও বোতামে কীভাবে ব্যবহার করবেন ? বা এটি সম্ভব নয়
ইজজি

এই বিকল্পের সাহায্যে আপনি কেবল এইচটিএমএলকে সরাসরি পরিচালনা করছেন, একটি রেডিও বোতামটি ঠিক আছে type="radio", এবং এইচটিএমএলে আপনি যেটি নির্বাচন করতে চান সেটি নির্বাচন করা উপরের মতোই checked="checked",। পার্থক্যটি হ'ল <input />একই নামের সাথে একাধিক উপাদান থাকবে । এইগুলির মধ্যে কোনটি অতিরিক্ত এইচটিএমএল প্রয়োগ করতে হবে সে বিষয়ে আপনাকে কাজ করা দরকার।
ড্যান সল্টমার

@Html.CheckBoxFor(x => x.Remember)এটি আমার জন্য কাজ করেছে
জাস্টলিয়ারিং


5

পরিবর্তে

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

ব্যবহার করুন:

 @Html.EditorFor(x => x.Remember)

এটি আপনাকে বিশেষভাবে মনে রাখার জন্য একটি চেকবক্স দেবে


4

ঠিক আছে, চেকবক্সটি কিছুটা অদ্ভুত। আপনি যখন এইচটিএমএল সহায়ক ব্যবহার করেন, এটি মার্কআপে দুটি চেকবাক্স ইনপুট উত্পন্ন করে এবং এটি উভয়ই যদি চেক করা থাকে তবে আইইনুমেবারের একটি নাম-মান জুটি হিসাবে পাস হয়।

এটি যদি মার্কআপটিতে যাচাই করা হয় না, তবে এটি কেবল লুকানো ইনপুটগুলিতেই পাস হয়ে যায় যার মানটির মিথ্যা।

সুতরাং আপনার কাছে থাকা মার্কআপের উদাহরণস্বরূপ:

      @Html.CheckBox("Chbxs") 

এবং কন্ট্রোলার অ্যাকশনে (নিশ্চিত হয়ে নিন যে নামটি নিয়ামকের চেকবক্সের পরম নামের সাথে মেলে):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

তারপরে নিয়ামক আপনি কিছু জিনিস যেমন করতে পারেন:

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

আমি জানি এটি একটি মার্জিত সমাধান নয়। আশা করি এখানে কেউ কিছু পয়েন্টার দিতে পারেন।


3

ফর্মের একটি চেক বাক্স থেকে প্রত্যাবর্তিত মানটিকে একটি বুলিয়ান সম্পত্তিতে রূপান্তরিত করতে আমি একটি কাস্টম মডেলবাইন্ডারে ভ্যালুপ্রোভিডারআরসাল্ট বিল্ড কনভার্টারে ব্যবহার করেছি।

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));

3

যদি মডেলের পরিবর্তে ফর্ম সংগ্রহের সাথে কাজ করা হয় তবে অ্যাসাইনমেন্টটি এতটা সহজ হতে পারে:

MyModel.Remember = fields["Remember"] != "false";

2

আমি অনুরূপ ইস্যুতে দৌড়েছি এবং চেকবক্স, লুক্কায়িত এবং এর মতো ছোট্ট জিক্যুরি ব্যবহার করে চেকবক্সের মান ফিরে পেতে সক্ষম হয়েছি:

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>

2

এটি একটি বড় ব্যথা হয়েছে এবং এটি সহজ হওয়া উচিত বলে মনে হয়। এখানে আমার সেটআপ এবং সমাধান।

আমি নিম্নলিখিত এইচটিএমএল সহায়ক ব্যবহার করছি:

@Html.CheckBoxFor(model => model.ActiveFlag)

তারপরে, নিয়ামকটিতে, আমি ফর্ম সংগ্রহটি যাচাই করছি এবং সে অনুযায়ী প্রক্রিয়া করছি:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;

সম্মত, আমি এটিকে আরও ছোট করে user.IsActive = fc["IsActive"] != "false";দিয়েছি কারণ আমি এখনও এটিতে স্ট্রিং তুলনা করতে নোংরা অনুভব করি।
ওয়াইল্ডজয়ে

1

আমি কেবল এটির মধ্যে দৌড়েছি (আমি বিশ্বাস করতে পারি না এটি বন্ধ / বন্ধ করে দেয় না!)

কোন পথে!

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

"চালু" বা "অফ" এর মান পোস্ট করবে।

এই ডাব্লুओএনটি একটি বুলিয়ানের সাথে আবদ্ধ, তবে আপনি এই নির্বাক কাজটি করতে পারেন!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}

1
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });

3
হ্যালো সুরেন্দ্রন এবং স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনি কোড অন্তর্ভুক্ত করার সময়, পাঠযোগ্যতার জন্য এটি ফর্ম্যাট করুন। তবে আরও গুরুত্বপূর্ণ বিষয়, অন্তর্ভুক্ত কোডটি কেন ওপি-র প্রশ্নকে সম্বোধন করে তা ব্যাখ্যা করা গুরুত্বপূর্ণ।
অ্যালেক্স এ।

1

মডেল ব্যবহার করে এমভিসি এর জন্য। মডেল:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

এইচটিএমএল:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

[এইচটিটিপি পোস্ট] ফাংশনে আমরা এর বৈশিষ্ট্যগুলি পেতে পারি।

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}

1

আপনি যদি সত্যিই প্লেইন এইচটিএমএল (যে কারণেই না কেন) ব্যবহার করতে চান এবং অন্তর্নির্মিত এইচটিএমএল হেল্পার এক্সটেনশানগুলি না ব্যবহার করতে চান তবে আপনি এটি এইভাবে করতে পারেন।

পরিবর্তে

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

ব্যবহার করার চেষ্টা করুন

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

এইচটিএমএল-তে কাজ করে চেকবক্স ইনপুটগুলি যাতে চেক করা হয় তখন তারা মানটি প্রেরণ করে এবং যখন তাদের চেক করা হয় না তখন তারা কোনও কিছুই প্রেরণ করে না (যার ফলে ASP.NET MVC এর ডিফল্ট মানটিতে পতিত হবে ক্ষেত্র, false)। এছাড়াও, এইচটিএমএলে চেকবাক্সের মান ঠিক / মিথ্যা নয় এমন কিছু হতে পারে, তাই যদি আপনি সত্যিই চেয়েছিলেন তবে আপনি নিজের মডেলের স্ট্রিং ফিল্ডের জন্য একটি চেকবক্সও ব্যবহার করতে পারেন।

যদি আপনি অন্তর্নির্মিতটি ব্যবহার করেন Html.RenderCheckbox, এটি আসলে দুটি ইনপুট দেয়: চেকবক্স এবং একটি লুকানো ক্ষেত্র যাতে চেকবক্সটি চেক করা না হলে একটি ভুয়া মান প্রেরণ করা হয় (কেবল কিছুই নয়)। এটি এর ফলে কিছু অপ্রত্যাশিত পরিস্থিতির কারণ হতে পারে:


0

একই নামের একাধিক চেকবক্সের জন্য ... অপ্রয়োজনীয় মিথ্যা অপসারণের কোড:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

ক্রিয়া

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

এটা ব্যবহার করো :

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}

0
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}

0

পরিবর্তন করুন মত মনে রাখবেন

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

কন্ট্রোলারে নলযোগ্য বুল ব্যবহার করুন এবং নালকে মিথ্যা করতে মিথ্যা করতে ফলব্যাক করুন

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}

0

আমার ক্ষেত্রে আমি get পদ্ধতিতে মডেল সম্পত্তি "মনে রাখবেন" সেট করছিলাম না। নিয়ামকটিতে আপনার যুক্তি পরীক্ষা করুন। আপনিও একই কাজ করছেন। আমি এই সাহায্য আশা করি!


0

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

আমার ফর্মটি Html.EditorFor(e => e.Property)চেকবক্সটি তৈরি করতে ব্যবহার FormCollectionকরে এবং নিয়ামক ব্যবহার করে এটি নিয়ামকের স্ট্রিংয়ের মানটি পাস 'true,false'করে।

যখন আমি ফলাফলগুলি পরিচালনা করি তখন আমি সেগুলির মধ্যে চক্রটি চালানোর জন্য একটি লুপ ব্যবহার করি - InfoPropertyফর্মটি থেকে মূল্যায়ন করা বর্তমান মডেলের মান উপস্থাপন করার জন্য আমি একটি উদাহরণও ব্যবহার করি ।

সুতরাং পরিবর্তে আমি খালি শব্দটি দিয়ে স্ট্রিংটি শুরু হয় কিনা তা যাচাই করে নিই 'true'এবং তারপরে একটি বুলিয়ান ভেরিয়েবল সেট trueকরে এবং এটি রিটার্ন মডেলে প্রেরণ করি।

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.