سؤال

تنبيه:هذا السؤال هو أكثر من تسع سنوات من العمر!

الخيار الأفضل هو البحث عن أحدث الأسئلة أو البحث عن الإجابات أدناه تبحث عن الخاص بك في إصدار محدد من MVC, كما العديد من الإجابات هنا عفا عليها الزمن الآن.

إذا كنت لا تجد جوابا التي تعمل على الإصدار الخاص بك ، يرجى التأكد من الإجابة يحتوي على نسخة من MVC تستخدمه.
(السؤال الأصلي يبدأ أدناه)


هذا يبدو قليلا غريبة بالنسبة لي ، ولكن بقدر ما أستطيع أن أقول, هذا هو كيف نفعل ذلك.

لدي مجموعة من الكائنات ، أريد للمستخدمين اختيار واحد أو أكثر منها.هذا يقول لي: "شكل مع مربعات." بلدي الكائنات لا تملك أي مفهوم "المختارة" (انهم بدائية بوكو شكلت من قبل تسلسل wcf الدعوة).لذا قم بما يلي:

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
}

لها فظيع في المقام الأول ، وثانيا ، على تلك البنود المستخدم التحقق ، FormCollection قوائم قيمته بوصفه "true false" بدلا من مجرد صحيح.

ومن الواضح أن أنا في عداد المفقودين شيء.أعتقد أن هذا هو مدمج مع الفكرة في الاعتبار أن الكائنات في المجموعة التي تتخذ في شكل html يتم تحديثها باستخدام UpdateModel() أو من خلال ModelBinder.

لكن الأشياء ليست أنشئت من أجل هذا ؛ هل يعني ذلك أن هذه هي الطريقة الوحيدة ؟ هل هناك طريقة أخرى للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

وHtml.CheckBox هو القيام بشيء غريب - إذا عرض المصدر على صفحة النتائج، سترى هناك ل<input type="hidden" /> التي يتم توليدها جنبا إلى جنب مع كل مربع، وهو ما يفسر القيم "الحقيقية كاذبة" ترونه لكل عنصر من عناصر النموذج.

وجرب هذا، والذي يعمل بالتأكيد على ASP.NET MVC بيتا لأنني حاولت ذلك فقط.

ووضع هذا في وجهة النظر بدلا من استخدام Html.CheckBox ():

<% 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 كل مربع هو GUID للكائن المقابل.

وبعد ذلك إضافة إلى عمل تحكم التالية (أو شيئا من هذا القبيل أن يفعل شيئا مفيدا بدلا من Response.Write ())

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

وهذا المثال سوف مجرد كتابة المعرفات الفريدة العمومية من مربعات هل راجعت. خرائط ASP.NET MVC القيم GUID من تحديد مربعات الاختيار في المعلمة Guid[] selectedObjects بالنسبة لك، وحتى يوزع سلاسل من مجموعة Request.Form إلى أشياء GUID instantied، التي أعتقد أنها لطيفة إلى حد ما.

نصائح أخرى

وHtmlHelper يضيف مدخلا مخفي بإخطار وحدة تحكم عن حالة لم يتم التحقق منه. ذلك أن الحالات التي تم اختيارها الصحيح:

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

في حال كنت أتساءل لماذا وضعوا حقل مخفي مع نفس الاسم مثل خانة الاختيار والسبب هو كما يلي :

تعليق من المصدرية MVCBetaSource\MVC\src\MvcFutures\Mvc\ButtonsAndLinkExtensions.cs

تجعل إضافية <input type="hidden".../> بالنسبة خانات.هذه عناوين سيناريوهات حيث دون رادع خانات يتم إرسالها في الطلب.إرسال رسالة خفية الإدخال يجعل من الممكن أن تعرف أن وكان الاختيار على الصفحة عند وكان الطلب المقدم.

أعتقد أن من وراء الكواليس وهم بحاجة إلى معرفة هذه الملزمة على المعلمات على وحدة تحكم أساليب العمل.ثم يمكن أن يكون ثلاثي الدولة منطقية أعتقد (ملزمة nullable منطقي المعلمة).لقد حاولت ذلك ولكن أنا على أمل أن يكون ما فعلوه.

ويجب عليك أيضا استخدام <label for="checkbox1">Checkbox 1</label> لثم الناس يمكن النقر على نص التسمية وكذلك خانة الاختيار نفسها. لها أيضا أسهل في الأسلوب وعلى الأقل في IE سيتم تسليط الضوء عليه عند التبويب من خلال الضوابط الصفحة.

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

وهذه ليست مجرد "يا أنا يمكن أن يفعل ذلك" الشيء. انها لكبير تعزيز تجربة المستخدم. حتى لو لم يكن جميع المستخدمين يعرفون أنهم يستطيعون الضغط على الملصق إرادة كثيرة.

أنا مندهش من أن أيا من هذه الإجابات استخدام المدمج في MVC ميزات هذا.

كتبت بلوق وظيفة حول هذا هنا, والتي حتى في الواقع روابط التسميات إلى مربع.لقد استخدمت EditorTemplate المجلد لإنجاز هذا في بيئة نظيفة و وحدات الطريقة.

ببساطة سوف ينتهي مع ملف جديد في EditorTemplate المجلد الذي يبدو مثل هذا:

@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)

زيارة بلدي بلوق وظيفة للحصول على مزيد من التفاصيل.

وإليك ما قمت به.

والشخصي:


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

وحدة التحكم:


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

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

ولقد وجدت الاكواد. * طرق المساعد ليست مفيدة جدا في بعض الحالات، وأنني كنت أفضل حالا القيام به في HTML سهل القديمة. هذه واحدة منها، والآخر الذي يتبادر إلى الذهن هو أزرار الراديو.

وتحرير: هذا هو على معاينة 5، من الواضح YMMV بين الإصدارات

ويبدو أنهم يختارون قراءة القيمة الأولى فقط، لذلك هذا هو "صحيح" عند تحديد مربع، و "كاذبة" عندما يتم تضمين فقط قيمة المخفية. وجلب هذا بسهولة مع رمز مثل هذا:

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

وDylan بيتي العظمى البحث! I شكرا جزيلا لك. لتوسيع أبعد من ذلك، هذه التقنية أيضا يعمل بشكل مثالي مع اقتراب عرض نموذج. MVC باردة جدا، انها ذكية بما فيه الكفاية لربط مجموعة من المعرفات الفريدة العمومية إلى خاصية التي تحمل نفس الاسم للكائن نموذج منضمة إلى عرض. مثال:

و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();
    }

وسوف أي شخص مطلع على فلسفة عرض نموذج يفرح، وهذا يعمل وكأنه البطل!

وأود أيضا أن أشير إلى أنه يمكنك اسم كل مربع اسم مختلف، ويكون هذا الاسم جزءا من المعلمات actionresults.

وعلى سبيل المثال،

والشخصي:

 <%= 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) {
    ...
}

ويتم تمرير القيم من أجل العمل منذ أسماء هي نفسها.

وأنا أعلم أن هذا الحل ليس مثاليا للمشروع الخاص بك، ولكنني اعتقدت أن رمي فكرة هناك.

<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";
         }
    }

وهذه المسألة يحدث في الإصدار 1.0 أيضا. Html.Checkbox () يسبب حقل مخفي آخر يضاف بنفس الاسم / معرف اعتبارا من مربع الأصلي. وكما كنت أحاول تحميل ما يصل مجموعة مربع باستخدام document.GetElemtentsByName ()، يمكنك تخمين كيف كانت الامور الحصول على افسدت. انها غريبة.

ومن ما يمكن جمع، ونموذج لا يريد أن يخمن ما إذا كان فحص = صحيحة أو خاطئة، وأنا حصلت على نحو هذا عن طريق تحديد سمة القيمة على عنصر مربع مع مسج قبل اعتماد النموذج مثل هذا:

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

وبهذه الطريقة، لا تحتاج عنصر مخفي فقط لتخزين قيمة مربع.

وأنا أعلم أن هذه المسألة كانت مكتوبة عندما كان MVC3 لا، ولكن لمن يأتي على هذا السؤال وتستخدم MVC3، قد ترغب الطريق "الصحيح" للقيام بذلك.

وحين اعتقد أن تفعل كله

Contains("true");

وشيء عظيم ونظيفة، ويعمل على جميع إصدارات MVC، والمشكلة هي أنه لا يأخذ بعين الاعتبار ثقافة (كما لو أنه يهم حقا في حالة وجود منطقي).

والطريقة "الصحيحة" لمعرفة قيمة منطقي، على الأقل في MVC3، هو استخدام ValueProvider.

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));
}

والآن، وجمال هذا يمكنك استخدام هذا مع عادل عن أي نوع بسيط، وسوف حتى تكون صحيحة على أساس الثقافة (اعتقد المال، الكسور العشرية، الخ).

ووValueProvider ما يستخدم عند تشكيل المجموعات الخاصة بك مثل هذا:

public ActionResult UpdatePermissions(bool permission_1, bool permission_2)

ولكن عندما تحاول بناء حيوي هذه القوائم والتحقق من القيم، وأنك لن تعرف من رقم في وقت الترجمة، بحيث يكون لديك لمعالجتها على الطاير.

وأسهل طريقة للقيام بذلك هي ...

وتعيين اسم وقيمة.

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

وبعد ذلك على تقديم انتزاع قيم مربعات وحفظ في مجموعة كثافة العمليات. ثم LINQ وظيفة مناسبة. هذا كل شيء ..

[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);
        }

ونفس الجواب nautic20، وفقط لمجرد استخدام النموذج الافتراضي MVC قائمة مربع ملزم مع نفس اسم خاصية جمع سلسلة / الباحث / التعداد في ViewModel. هذا هو عليه.

ولكن قضية واحدة يحتاج أن نشير إلى. في كل مكون مربع، يجب أن لا تضع "إيد" في ذلك والتي سوف تؤثر نموذج MVC ملزمة.

وسوف بعد قانون العمل للربط نموذج:

 <% 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>
<% } %>

وهذا ما فعلته أن تفقد القيم مزدوجة عند استخدام Html.CheckBox (...

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

ومع فحص 4 صناديق، لحالها، دون رادع، ودققت يتحول صحيح، كاذبة، كاذبة، كاذبة، صحيح، كاذبة إلى صحيح، كاذبة، كاذبة، صحيح. فقط هو ما أحتاجه

وماذا عن شيء مثل هذا؟

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

عند استخدام HtmlHelper مربع، أنا أفضل بكثير من العمل مع بيانات النموذج مربع نشرها كما صفيف. أنا لا أعرف حقا لماذا، وأنا أعلم أن وسائل أخرى تعمل، ولكن أعتقد أنا فقط تفضل لعلاج فاصلة سلاسل فصل كصفيف إلى أقصى حد ممكن.

سوف

وهكذا تفعل 'فحص' أو الاختبار الحقيقي يكون:

//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 لأن هذا يعود كما صفيف.

ومجرد القيام بذلك على $(document).ready:

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

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

    }
});

وبلدي الحل هو:

<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>  

وأكثر يمكنك أن تجد هنا: <وأ href = "http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized-as-a-valid -boolean / "يختلط =" نوفولو "> http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized- كما هو وجود صالح-منطقية /

وكان ما يقرب من تم حجب نفس المشكلة ولكن القيمة عودة المراقب بلدي مع القيم الأخرى.

وجدت الحل بسيط ولكن يبدو قليلا الخام.

وحاول أن اكتب 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()" />

وعن طريقmmacaulay، خطرت لي هذه لمنطقي:

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

إذا دققت نشط = صحيح

إذا لم يتم التحقق منه نشط = كاذبة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top