Estoy usando Steve Sanderson BeginCollectionItem ayudante y se topó con un problema. Tengo un formulario que tiene una opción para añadir ilimitado recompensa campos. Estoy usando su ayudante ya lo ha resuelto este problema con cómo mantener la generación de los campos y no tiene que preocuparse acerca de cómo enlazar cuando el formulario sea enviado.

Que tengo en este mismo formulario de algunas casillas de verificación que hay una cantidad desconocida. La diferencia con este, frente a las recompensas es la cantidad desconocida será conocido después de una base de datos llamada y será conocido por el tiempo en que el código se obtiene a la vista.

Así que mi código es este

  public class FrmVm
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public bool Active { get; set; }

        public IList<WarrantyFeaturesVm> WarrantyFeaturesVm { get; set; } //this is the checkbox ones.
         public IList<RewardVms> RewardVms { get; set; } //this is the dyanmic one that I needed the helper for

        public CbCreditCardFrmVm()
        {
            Active = true;
            WarrantyFeaturesVm = new List<WarrantyFeaturesVm>();
             RewardVms = new List<RewardVms>();
        }
    }


    //view

    @foreach (var tier in Model.RewardVms)
    {
            @Html.Partial("GenerateReward", tier)   //in this partial view in the  BeginCollectionItem                 
     }



 @foreach (var warranties in Model.WarrantyFeaturesVm)
{
    using (Html.BeginCollectionItem("WarrantyFeaturesVm"))
    { 
      <span>@warranties.Name:</span>
      @Html.TextBoxFor(x => warranties.FeatureId)
      @Html.CheckBoxFor(x => warranties.HasFeature)
    }
}

Estoy utilizando jquery para enviar los datos mediante el uso de serializeArray(). Cuando se va al servidor en el que se unen todos los dinámicos correctamente e incluso se une la Garantía a la Colección(la colección cuenta es 1). Sin embargo, nunca se une nada entrañas de la WarrantyFeaturesVm, todo queda como predeterminado.

si puedo eliminar el uso de (Html.BeginCollectionItem("WarrantyFeaturesVm")) entonces ni siquiera se unen a la colección.

Alguien sabe por qué no es vinculante nada en la colección?

Editar

//for loop (works)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: none;">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[0].FeatureId" id="WarrantyFeaturesVm_0__FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default">    <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[0].HasFeature" id="WarrantyFeaturesVm_0__HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[0].HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</form>
//foreach loop beginItemCollection(does not work)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: inline;">
<input type="hidden" value="68ba9241-c409-4f4b-96da-cce13b127c1e" autocomplete="off" name="WarrantyFeaturesVm.index" class="ui-wizard-content ui-helper-reset ui-state-default">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.FeatureId" id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__war_FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default">            <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.HasFeature" id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__war_HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</span>
</form>
//for loop beginItemCollection (does not work)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: none;">
<input type="hidden" value="fe3fbc82-a2df-476d-a15a-dacd841df97e" autocomplete="off" name="WarrantyFeaturesVm.index" class="ui-wizard-content ui-helper-reset ui-state-default">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].FeatureId" id="WarrantyFeaturesVm_fe3fbc82-a2df-476d-a15a-dacd841df97e__WarrantyFeaturesVm_0__FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default">            <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].HasFeature" id="WarrantyFeaturesVm_fe3fbc82-a2df-476d-a15a-dacd841df97e__WarrantyFeaturesVm_0__HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</span>
<span id="adminSettings" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: inline;">
</form>
Y su foreach garantías dentro de un Html.BeginForm? ¿Te importaría publicar algunos ejemplos de HTML de salida para un conjunto de garantías?
Sí, ellos están en un Html.BeginForm. Creo que he descubierto(parcialmente). Si puedo cambiar el bucle foreach para un forloop, a continuación, hacer algo como @Html.TextBoxFor(x => el Modelo.WarrantyFeaturesVm[i].FeatureId)funciona. No sé por qué la beginCollection no trabajando.
El cuaderno de modelo se ve en el código HTML. Compruebe las diferencias en la forma en el código HTML de identificación son prestados de manera diferente en los 2 casos diferentes. Hacemos uso de foreach a menudo con BeginCollectionItem, pero a menudo la BeginCollectionItem es parcial o editor de plantilla.
Así que hice la prueba. Algo raro está pasando con los nombres.
Intenta usando Html.HiddenFor de la guerra (=> de la guerra.FeatureId) en lugar de Html.HiddenFor(m => de la guerra.FeatureId)?

OriginalEl autor chobo2 | 2011-12-19

1 Comentario

  1. 8

    Ok creo que puedo ver lo que está pasando aquí.

    En el segundo ejemplo, donde se hizo el foreach, parece que su cshtml fue algo como esto (@ símbolos puede ser incorrecta):

    foreach (var war in Model.WarrantyFeaturesVm) {
    using (Html.BeginCollectionItem("WarrantyFeaturesVm")) {
    Html.HiddenFor(m => war.FeatureId)
    <span>@Html.DisplayFor(m => war.Name)</span>
    Html.HiddenFor(m => war.HasFeature)
    }
    }

    Porque BeginCollectionItem utiliza su contexto para derivar el código HTML de nombres y de id, esta es la razón por la que terminan con «guerra» en el id y nombres. El modelo de cuaderno está buscando una propiedad de colección denominada «WarrantyFeaturesVm», la que se encuentra. Sin embargo es entonces buscando una propiedad llamada «guerra» en el WarrantyFeaturesVm viewmodel, que no puede encontrar, y por lo tanto no se unen.

    <input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" 
    name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.FeatureId" 
    id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__war_FeatureId" .../>

    En el 3er escenario, es similar. Lo que busca es la WarranyFeaturesVm propiedad de colección, la que se encuentra. No obstante, busca otro elemento de colección.

    <input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" 
    name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].FeatureId" 
    id="WarrantyFeaturesVm_fe3fbc82-a2df-476d-a15a-dacd841df97e__WarrantyFeaturesVm_0__FeatureId" .../>

    Con el fin de enlazar correctamente, el HTML tiene un aspecto similar a su primera HTML ejemplo:

    <input type="hidden" value="68ba9241-c409-4f4b-96da-cce13b127c1e" 
    name="WarrantyFeaturesVm.index" .../>
    <input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" 
    name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].FeatureId" 
    id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__FeatureId" .../>

    Como mencioné en mi comentario, usted puede lograr esto al poner el BeginCollectionItem y todo se envuelve en una visión parcial. La vista parcial, a continuación, recibirá su propio contexto, ya que sus ayudantes se utilice el punto de vista del @Modelo de propiedad con el stongly-escribió ayudantes así: @Html.WidgetFor(m => m.PropertyName).

    Por otro lado, si usted realmente necesita la colección a ser prestados en el exterior de vista, no veo ningún problema en el uso normal de indexación (de tipo entero) con un bucle for y sin BeginCollectionItem.

    Actualización

    Cavé este antiguo puesto de Phil Haack. Un extracto:

    …mediante la introducción de un extra oculto de entrada, puede permitir que para arbitrario
    los índices. En el ejemplo a continuación, proporcionamos una entrada oculto con el
    .Índice de sufijo para cada uno de los artículos que necesita para unirse a la lista. El nombre de
    cada uno de estos ocultos entradas están a la misma, así como se describió anteriormente,
    esto le dará el modelo de cuaderno de una buena colección de índices para buscar
    para cuando la unión a la lista.

    <form method="post" action="/Home/Create">
    <input type="hidden" name="products.Index" value="cold" />
    <input type="text" name="products[cold].Name" value="Beer" />
    <input type="text" name="products[cold].Price" value="7.32" />
    <input type="hidden" name="products.Index" value="123" />
    <input type="text" name="products[123].Name" value="Chips" />
    <input type="text" name="products[123].Price" value="2.23" />
    <input type="hidden" name="products.Index" value="caliente" />
    <input type="text" name="products[caliente].Name" value="Salsa" />
    <input type="text" name="products[caliente].Price" value="1.23" />
    <input type="submit" />
    </form>

    BeginCollectionItem utiliza este método de indización para asegurarse de que el modelo de enlace que sucede. La única diferencia es que utiliza Guid en lugar de enteros como el indizador. Pero usted puede configurar manualmente los indizador como en el de Phil ejemplo anterior.

    Ah. Voy a tener que probar esto. Ya que sólo va a utilizar el entero basado en camino, pero al principio pensaba que de alguna manera el ayudante estaba efectuando de que cuando realmente sólo estaba haciendo mal lol.
    BeginCollectionItem no es perfecto. Esta es la única cosa que echo de menos hacer php hace 10 años. Me encantaría si MVC vamos a pasar en colecciones simplemente usando input id=»CollectionProperty[]». Sería mucho más fácil.

    OriginalEl autor danludwig

Dejar respuesta

Please enter your comment!
Please enter your name here