Frage

Achtung: Diese Frage ist mehr als neun Jahre alt

!

Ihre beste Möglichkeit ist für neuere Fragen zu suchen, oder die Antworten unter der Suche nach Ihrer spezifischen Version von MVC zu suchen, wie hier viele Antworten jetzt veraltet sind.

Wenn Sie eine Antwort nicht finden, die für Ihre Version funktioniert, stellen Sie sicher, dass die Antwort die Version von MVC enthält Sie verwenden.
(Die ursprüngliche Frage beginnt unten)


Dies scheint ein wenig seltsam für mich, aber soweit ich das beurteilen kann, das ist, wie Sie es tun.

Ich habe eine Sammlung von Objekten, und ich mag die Benutzer eine oder mehr von ihnen wählen. Das sagt mir „-Form mit Kontrollkästchen.“ Meine Objekte haben keinen Begriff der „selected“ (sie sind rudimentär POCO gebildet durch einen wcf Anruf Deserialisieren). Also, ich wie folgt vor:

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

In der Ansicht:

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

Und in der Steuerung, ist dies der einzige Weg, die ich sehen kann, um herauszufinden, was die Benutzerobjekte geprüft:

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

Die ausgeflippt in erster Linie, und zweitens, für diese Elemente der Benutzer überprüft, listet der Formcollection seinen Wert als „true false“ und nicht nur wahr.

Natürlich, ich bin etwas fehlt. Ich denke, dass dies mit der Idee im Kopf eingebaut ist, dass die Objekte in der Sammlung, die auf innerhalb der HTML-Form gehandelt wird aktualisiert werden unter Verwendung UpdateModel() oder durch einen Modelbinder.

Aber meine Objekte sind nicht dafür eingerichtet; bedeutet das, dass dies der einzige Weg ist? Gibt es eine andere Möglichkeit, es zu tun?

War es hilfreich?

Lösung

Html.CheckBox ist seltsam, etwas zu tun - wenn Sie Quelle auf der angezeigten Seite zu sehen, werden Sie sehen, es gibt eine <input type="hidden" /> neben jeder Checkbox erzeugt wird, die die „true false“ Werte erklärt Sie für jedes Formularelement ist zu sehen.

Versuchen Sie dieses, das auf ASP.NET MVC Beta definitiv funktioniert, weil ich habe es gerade ausprobiert.

Setzen Sie diese in der Ansicht anstelle der Verwendung 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" />
<%}%>

Ihre Kontrollkästchen werden alle genannt selectedObjects und die value jedes Kästchen ist die GUID des entsprechenden Objekts.

Geben Sie dann die folgende Controller-Aktion (oder etwas ähnliches, die etwas Nützliches statt Response.Write tut ())

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

In diesem Beispiel schreibt nur die GUIDs der Boxen Sie überprüfen; ASP.NET MVC ordnet die GUID-Werte des ausgewählten Kontrollkästchen in den Guid[] selectedObjects Parameter für Sie, und analysiert auch die Saiten der Request.Form Sammlung in instantied GUID-Objekte, die ich denke, ziemlich nett ist.

Andere Tipps

Htmlhelper fügt einen versteckten Eingang des Controllers über Ungeprüfter Status zu informieren. So hat den richtigen geprüft Status:

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

Falls Sie sich fragen, warum sie ein verstecktes Feld setzen Sie sich mit dem gleichen Namen wie die Checkbox der Grund ist wie folgt:

Kommentar aus dem Sourcecode MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs

  

ein zusätzliches <input type="hidden".../> für Kontrollkästchen Render.   Diese Adressen Szenarien, in denen   ungeprüfte Kontrollkästchen werden nicht gesendet in   die Anfrage. Senden einer versteckten Eingang   zu wissen, macht es möglich, dass die   Checkbox, war auf der Seite vorhanden, wenn   der Antrag eingereicht wurde.

Ich denke, hinter den Kulissen die sie benötigen, dies zu wissen für die Parameter für die Controller-Aktion Methoden zu binden. Sie könnten dann einen Tri-State-boolean habe ich (gebunden an einen Nullable-Bool-Parameter) annehmen. Ich habe es nicht versucht, aber ich hoffe, das ist, was sie getan haben.

Sie sollten auch <label for="checkbox1">Checkbox 1</label> verwenden, weil dann können die Menschen auf dem Etikett Text klicken und das Kontrollkästchen selbst. Es ist auch leichter zu frisieren und zumindest in IE wird es hervorgehoben, wenn Sie mit der Tabulatortaste durch die Seite steuert.

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

Dies ist nicht nur eine ‚Oh, ich könnte es tun‘ Sache. Es ist eine bedeutende Erweiterung User Experience. Auch wenn nicht alle Benutzer wissen, dass sie auf dem Etikett viele werden klicken.

Ich bin überrascht, keine dieser Antworten des eingebauten MVC Funktionen zum Einsatz.

ich einen Blog-Post über das geschrieben hat? Blog-Post Besuchen für weitere Details.

Hier ist, was ich getan habe.

Ausblick:


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

Controller:


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

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

ich die Html gefunden. * Hilfsmethoden nicht so nützlich, in einigen Fällen, und dass ich besser dran, es in plain old HTML zu tun. Dies ist einer von ihnen, der andere in den Sinn kommt, ist Radio-Buttons.

Edit:. Dies ist auf Preview 5, offensichtlich YMMV zwischen den Versionen

Sie scheinen zu entscheiden sich nur den ersten Wert zu lesen, so ist dies „true“, wenn das Kontrollkästchen aktiviert ist, und „falsch“, wenn nur der versteckte Wert enthalten ist. Dies ist leicht mit Code wie folgt abgerufen:

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

@Dylan Beattie Great Find !!! Ich danke Ihnen sehr. Noch weiter ausbauen, diese Technik funktioniert auch perfekt mit dem Abspielen Modell Ansatz. MVC ist so cool, es ist intelligent genug, um eine Reihe von Guids auf eine Eigenschaft mit dem gleichen Namen des Modellobjekts an die Ansicht gebunden zu binden. Beispiel:

Ansichtsmodell:

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

Ausblick:

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

Controller:

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

Wer die Ansicht Modell Philosophie wird sich freuen, das funktioniert wie ein Champ!

Ich möchte auch darauf hinweisen, dass Sie jede Checkbox einen anderen Namen nennen können, und haben diesen Namen Teil der actionresults Parameter.

Beispiel:

Ausblick:

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

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

Controller:

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

Die Werte aus der Sicht werden an die Aktion übergeben, da die Namen gleich sind.

Ich weiß, dass diese Lösung nicht ideal für Ihr Projekt ist, aber ich dachte, dass ich da draußen die Idee werfen würde.

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

Aus dem Controller:

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

         var s = fc["checkbox1"];

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

Dieses Problem geschieht in der Release 1.0 als auch. Html.CheckBox () bewirkt, dass ein weiteres verstecktes Feld mit dem gleichen Namen / id wie Ihrer ursprünglichen Checkbox hinzugefügt werden. Und wie ich versuche, wurde ein Kontrollkästchen Array Laden bis document.GetElemtentsByName () verwenden, können Sie erraten, wie die Dinge immer durcheinander. Es ist eine bizarre.

Von dem, was ich sammeln kann, das Modell will nicht erraten, ob = wahr oder falsch überprüft, habe ich um diese durch ein Value-Attribut auf das Kontrollkästchen Element mit jQuery Einstellung bevor Sie das Formular wie folgt einreichen:

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

Auf diese Weise brauchen Sie nicht ein verstecktes Element nur den Wert der Option zu speichern.

Ich weiß, dass diese Frage wurde geschrieben, als MVC3 nicht aus, sondern für jeden, der auf diese Frage kommt und verwende MVC3, können Sie den „richtigen“ Weg, dies zu tun.

Während ich denke, dass die ganze tun

Contains("true");

Sache ist groß und sauber, und funktioniert auf all MVC-Versionen, ist das Problem, dass es nicht Kultur Rechnung trägt (als ob es wirklich im Fall eines Bool zählt).

Der „richtige“ Weg, um den Wert eines Bool, um herauszufinden, zumindest in MVC3, ist das Valueprovider zu verwenden.

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

Ich tue dies in einem meiner Kunden-Sites, wenn ich Berechtigungen bearbeiten:

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

Nun wird die Schönheit dieser können Sie diese verwenden, um mit fast jede einfache Art, und es wird sogar richtig sein, auf der Grundlage der Kultur (man denke an Geld, Dezimalzahlen, etc).

Der Valueprovider ist, was verwendet wird, wenn Sie Ihre Aktionen wie diese bilden:

public ActionResult UpdatePermissions(bool permission_1, bool permission_2)

aber wenn Sie dynamisch versuchen, diese Listen zu erstellen und die Werte überprüfen, werden Sie nie die Id bei der Kompilierung kennen, so dass Sie sie schnell verarbeiten.

Der einfachste Weg, dies zu tun ist ...

Sie legen Sie den Namen und Wert.

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

Dann auf der Einreichung die Werte des Kontrollkästchen und speichern in einem int-Array greifen. dann die entsprechende LinQ Funktion. Das ist es ..

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

Wie bei nautic20 Antwort, verwenden Sie einfach nur MVC Standardmodell Bindung Checkbox-Liste mit dem gleichen Namen als eine Sammlung Eigenschaft String / int / ENUM in Ansichtsmodell. Das ist es.

Aber ein Problem muß darauf hinweisen. In jedem Kästchen Komponente, sollten Sie in ihr „Id“ nicht die Bindung MVC-Modell auswirken wird.

Code Nach arbeitet für Modell Bindung:

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

Folgende Codes werden nicht an Modellbindung (Unterschied hier ist es id für jede Checkbox zugewiesen)

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

Dies ist, was ich tat, die doppelten Werte zu verlieren, wenn die Html.CheckBox mit (...

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

mit 4 Boxen geprüft, ungeprüft, ungeprüft, geprüft es stellt sich wahr, falsch, falsch, falsch, wahr, falsch in wahr, falsch, falsch, wahr. genau das, was ich brauchte

Wie wäre es so etwas wie das?

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

Wenn Sie das Kontrollkästchen Htmlhelper verwenden, ich viel lieber mit den angebrachten Kontrollkästchen Formulardaten als ein Array zu arbeiten. Ich weiß nicht wirklich, warum, ich weiß, die anderen Methoden arbeiten, aber ich denke, ich ziehe nur durch Komma getrennt Strings als Array so viel wie möglich zu behandeln.

einen 'geprüft' oder wahren Test So tun wäre:

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

einen falschen Scheck tun wäre:

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

Der Hauptunterschied ist GetValues zu verwenden, wie dies als ein Array zurückgibt.

Genau das tut dies auf $(document).ready:

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

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

    }
});

Meine Lösung ist:

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

Mehr finden Sie hier: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized- as-a-valid-boolean /

Ich habe fast das gleiche Problem, aber der Rückgabewert meines Controllers wurde mit anderen Werten blockiert.

Gefunden eine einfache Lösung, aber es scheint ein wenig rau.

Versuchen Viewbag. in Ihrem Controller zu geben und jetzt ist es Ihnen einen Namen geben wie Viewbag.Checkbool

Wechseln Sie nun in der Ansicht und versuchen, diese @Viewbag.Checkbool damit Sie den Wert aus der Steuerung erhalten.

Meine Reglerparameter wie folgt aussehen:

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

und meine Checkbox wird wie folgt aktualisiert werden:

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

Mit @mmacaulay, kam ich mit diesem für Bool up:

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

Wenn diese Option aktiviert aktiv = true

Wenn deaktiviert aktiv = false

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top