আমি কেবল লক্ষ্য করেছি যে Html.CheckBox("foo")
একটিটির পরিবর্তে 2 ইনপুট উত্পন্ন করে, কেউ জানেন কেন এমন হয়?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
আমি কেবল লক্ষ্য করেছি যে Html.CheckBox("foo")
একটিটির পরিবর্তে 2 ইনপুট উত্পন্ন করে, কেউ জানেন কেন এমন হয়?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
উত্তর:
যদি চেকবক্সটি নির্বাচিত না হয় তবে ফর্ম ক্ষেত্রটি জমা দেওয়া হবে না। যে কারণে লুকানো ক্ষেত্রে সর্বদা মিথ্যা মান থাকে। যদি আপনি চেকবক্সটি চেক না করে ছেড়ে দেন তবে লুকানো ক্ষেত্র থেকে ফর্মটির এখনও মান থাকবে। এএসপি.এনইটি এমভিসি চেকবক্সের মানগুলি হ্যান্ডেল করে।
আপনি যদি তা নিশ্চিত করতে চান তবে ফর্মটিতে একটি চেকবাক্স এইচটিএমএল.হাইডেড নয়, দিয়ে রাখুন <input type="checkbox" name="MyTestCheckboxValue"></input>
। চেকবক্সটি চেক না করে ছেড়ে দিন, ফর্মটি জমা দিন এবং সার্ভারের পাশে পোস্ট করা অনুরোধের মানগুলি দেখুন। আপনি দেখতে পাবেন যে কোনও চেকবক্সের মান নেই। আপনার যদি লুকানো ক্ষেত্র থাকে তবে এটিতে মান MyTestCheckboxValue
সহ এন্ট্রি থাকবে false
।
IsActive
, যা true
কনস্ট্রাক্টারে শুরু করা হয়েছে। ব্যবহারকারী চেকবক্সটি নির্বাচন মুক্ত করে, তবে যেহেতু মানটি সার্ভারে প্রেরণ করা হয় না, তাই মডেল বাইন্ডার এটি গ্রহণ করে না, এবং সম্পত্তি মান পরিবর্তন করা হয় না। মডেল বাইন্ডার ধরে নেওয়া উচিত নয়, মানটি না পাঠানো হলে এটি মিথ্যাতে সেট করা হয়েছিল, কারণ এই মানটি না পাঠানো আপনার সিদ্ধান্ত হতে পারে।
false
চেক করা হলেও মান পাঠায় এবং তা বিভ্রান্তিকর। অক্ষম চেকবাক্সগুলিতে কোনও মানই প্রেরণ করা উচিত নয়, যদি এএসপি.এনইটি ডিফল্ট এইচটিটিপি আচরণের সাথে সামঞ্জস্য করতে চায়।
লুকানো ইনপুট যুক্ত করা রোধ করতে আপনি কোনও সহায়ক লিখতে পারেন:
using System.Web.Mvc;
using System.Web.Mvc.Html;
public static class HelperUI
{
public static MvcHtmlString CheckBoxSimple(this HtmlHelper htmlHelper, string name, object htmlAttributes)
{
string checkBoxWithHidden = htmlHelper.CheckBox(name, htmlAttributes).ToHtmlString().Trim();
string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
return new MvcHtmlString(pureCheckBox);
}
}
এটা ব্যবহার করো:
@Html.CheckBoxSimple("foo", new {value = bar.Id})
@using Your.Name.Space
ছড়িয়ে দিয়েছে ঠিক তেমন ক্ষেত্রে যদি ... আপনার সহায়ক যদি কোনও নেমস্পেসে থাকে তবে আপনার .cshtml রেজার ভিউ ফাইলের শীর্ষে যুক্ত করতে ভুলবেন না ।
System.Web.Mvc.Html
দর্শনে সমস্ত মতামত অ্যাক্সেসযোগ্য রাখার জন্য রাখুন
ম্যানুয়াল পদ্ধতিটি হ'ল:
bool IsDefault = (Request.Form["IsDefault"] != "false");
এটি আলেকজান্ডার ট্রফিমভের সমাধানের দৃ strongly়ভাবে টাইপিত সংস্করণ:
using System.Web.Mvc;
using System.Web.Mvc.Html;
public static class HelperUI
{
public static MvcHtmlString CheckBoxSimpleFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes)
{
string checkBoxWithHidden = htmlHelper.CheckBoxFor(expression, htmlAttributes).ToHtmlString().Trim();
string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
return new MvcHtmlString(pureCheckBox);
}
}
লুকানো ইনপুট স্টাইলযুক্ত চেকবক্সগুলিতে সমস্যা তৈরি করছিল। তাই আমি চেকবক্সযুক্ত ডিভের বাইরে লুকানো ইনপুট রাখার জন্য একটি এইচটিএমএল সহায়ক সাহায্যকারী এক্সটেনশন তৈরি করেছি।
using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;
namespace YourNameSpace
{
public static class HtmlHelperExtensions
{
public static MvcHtmlString CustomCheckBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, string labelText)
{
//get the data from the model binding
var fieldName = ExpressionHelper.GetExpressionText(expression);
var fullBindingName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var modelValue = metaData.Model;
//create the checkbox
TagBuilder checkbox = new TagBuilder("input");
checkbox.MergeAttribute("type", "checkbox");
checkbox.MergeAttribute("value", "true"); //the visible checkbox must always have true
checkbox.MergeAttribute("name", fullBindingName);
checkbox.MergeAttribute("id", fieldId);
//is the checkbox checked
bool isChecked = false;
if (modelValue != null)
{
bool.TryParse(modelValue.ToString(), out isChecked);
}
if (isChecked)
{
checkbox.MergeAttribute("checked", "checked");
}
//add the validation
checkbox.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(fieldId, metaData));
//create the outer div
var outerDiv = new TagBuilder("div");
outerDiv.AddCssClass("checkbox-container");
//create the label in the outer div
var label = new TagBuilder("label");
label.MergeAttribute("for", fieldId);
label.AddCssClass("checkbox");
//render the control
StringBuilder sb = new StringBuilder();
sb.AppendLine(outerDiv.ToString(TagRenderMode.StartTag));
sb.AppendLine(checkbox.ToString(TagRenderMode.SelfClosing));
sb.AppendLine(label.ToString(TagRenderMode.StartTag));
sb.AppendLine(labelText); //the label
sb.AppendLine("<svg width=\"10\" height=\"10\" class=\"icon-check\"><use xlink:href=\"/icons.svg#check\"></use></svg>"); //optional icon
sb.AppendLine(label.ToString(TagRenderMode.EndTag));
sb.AppendLine(outerDiv.ToString(TagRenderMode.EndTag));
//create the extra hidden input needed by MVC outside the div
TagBuilder hiddenCheckbox = new TagBuilder("input");
hiddenCheckbox.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
hiddenCheckbox.MergeAttribute("name", fullBindingName);
hiddenCheckbox.MergeAttribute("value", "false");
sb.Append(hiddenCheckbox.ToString(TagRenderMode.SelfClosing));
//return the custom checkbox
return MvcHtmlString.Create(sb.ToString());
}
ফলাফল
<div class="checkbox-container">
<input checked="checked" id="Model_myCheckBox" name="Model.myCheckBox" type="checkbox" value="true">
<label class="checkbox" for="Model_myCheckBox">
The checkbox label
<svg width="10" height="10" class="icon-check"><use xlink:href="/icons.svg#check"></use></svg>
</label>
</div>
<input name="Model.myCheckBox" type="hidden" value="false">
আমি যখন একটি ওয়েবগ্রিড পেয়েছিলাম তখন সত্যিই এটির কারণগুলির কারণগুলি পেয়েছি। ওয়েবগ্রিডে বাছাই করা লিঙ্কগুলি দ্বিগুণ আপ ক্যোরিস্ট্রিং বা x = সত্য এবং x = মিথ্যে x = সত্য, মিথ্যাতে পরিণত হবে এবং এর জন্য চেকবাক্সে পার্স ত্রুটি ঘটবে।
আমি ক্লায়েন্টের পাশের লুকানো ক্ষেত্রগুলি মুছতে jQuery ব্যবহার করে শেষ করেছি:
<script type="text/javascript">
$(function () {
// delete extra hidden fields created by checkboxes as the grid links mess this up by doubling the querystring parameters
$("input[type='hidden'][name='x']").remove();
});
</script>