MVC 5 после сериализации проблемы, когда пара значений имени отсутствует в коллекции [duplicate]

Для этого вы можете использовать следующую команду git.

 git rebase -i HEAD~n

n (= 4 здесь) - это номер последней фиксации. Затем вы получите следующие опции:

pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....

Обновить, как показано ниже,

p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....

Подробнее см. Ссылку

Удачи !!

40
задан Leniel Maccaferri 20 February 2012 в 17:23
поделиться

6 ответов

У меня это работает. Не забудьте добавить общий скрытый ввод индексирования, как описано в вашей статье:

Скрытый ввод с name = Items.Index является ключевой частью

<input type="hidden" name="Items.Index" value="0" />
<input type="text" name="Items[0].Name" value="someValue1" />

<input type="hidden" name="Items.Index" value="1" />
<input type="text" name="Items[1].Name" value="someValue2" />

<input type="hidden" name="Items.Index" value="3" />
<input type="text" name="Items[3].Name" value="someValue3" />

<input type="hidden" name="Items.Index" value="4" />
<input type="text" name="Items[4].Name" value="someValue4" />

надеюсь, что это поможет

67
ответ дан Bassam Mehanni 27 August 2018 в 08:04
поделиться

Статья, на которую вы ссылались, является старой (MVC2), но, насколько я знаю, это по-прежнему метод defacto для моделирования коллекций привязок с использованием стандартного модуля моделирования.

Если вы хотите несекретную индексацию, как говорит Bassam, вам нужно будет указать индексатор. Индексатор не должен быть числовым.

Для этого мы используем «Помощник по использованию Html для начинающих» Стива Сандерсона . Он автоматически генерирует указатель как Guid. Я думаю, что это лучший подход, чем использование числовых индексаторов, когда ваш элемент коллекции HTML не является последовательным.

4
ответ дан danludwig 27 August 2018 в 08:04
поделиться

Я боролся с этим на этой неделе, и ответ Бассама был ключом к тому, чтобы меня на правильном пути. У меня есть динамический список элементов инвентаря, который может иметь поле количества. Мне нужно было знать, сколько из этих элементов они выбрали, кроме списка элементов может варьироваться от 1 до n .

Мое решение было довольно простым в конце. Я создал ViewModel под названием ItemVM с двумя свойствами. ItemID и количество. В post post я принимаю список из них. При индексировании все элементы передаются ... даже с нулевым количеством. Вы должны проверить и обработать его на стороне сервера, но с итерацией тривиально обращаться с этим динамическим списком.

В моем представлении я использую что-то вроде этого:

@foreach (Item item in Items)
{
<input type="hidden" name="OrderItems.Index" value="@item.ItemID" />
<input type="hidden" name="OrderItems[@item.ItemID].ItemID" value="@item.ItemID" />
<input type="number" name="OrderItems[@item.ItemID].Quantity" />
}

Это дает me Список с индексом 0, но итерация в контроллере извлекает все необходимые данные из новой сильно типизированной модели.

public ActionResult Marketing(List<ItemVM> OrderItems)
...
        foreach (ItemVM itemVM in OrderItems)
            {
                OrderItem item = new OrderItem();
                item.ItemID = Convert.ToInt16(itemVM.ItemID);
                item.Quantity = Convert.ToInt16(itemVM.Quantity);
                if (item.Quantity > 0)
                {
                    order.Items.Add(item);
                }
            }

Затем вы получите набор элементов, которые имеют количество больше 0 и Идентификатор элемента.

Этот метод работает в MVC 5 с использованием EF 6 в Visual Studio 2015. Может быть, это поможет кому-то найти такое решение, как я.

2
ответ дан Jason Conville 27 August 2018 в 08:04
поделиться

Этот вспомогательный метод, основанный на подходе Стива Сандерсона, намного проще и может использоваться для привязки любого элемента в коллекции и, похоже, работает с привязкой к модели MVC.

public static IHtmlString AnchorIndex(this HtmlHelper html)
{
    var htmlFieldPrefix = html.ViewData.TemplateInfo.HtmlFieldPrefix;
    var m = Regex.Match(htmlFieldPrefix, @"([\w]+)\[([\w]*)\]");
    if (m.Success && m.Groups.Count == 3)
        return
            MvcHtmlString.Create(
                string.Format(
                    "<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />",
                    m.Groups[1].Value, m.Groups[2].Value));
    return null;
}

Например. Просто назовите его в EditorTemplate или где-нибудь еще, вы будете генерировать входы, как показано ниже, чтобы сгенерировать привязку привязки индекса, если она применима.

@model SomeViewModel
@Html.AnchorIndex()
@Html.TextBoxFor(m => m.Name)
... etc.

Я думаю, что у нее есть несколько преимуществ по сравнению с подходом Стива Сандерсона .

  1. Он работает с EditorFor и другими встроенными механизмами обработки перечислимых. Таким образом, если Items является свойством IEnumerable<T> в модели представления, то работает как ожидается: <ul id="editorRows" class="list-unstyled"> @Html.EditorFor(m => m.Items) @* Each item will correctly anchor allowing for dynamic add/deletion via Javascript *@ </ul>
  2. Это проще и не требует никаких магических строк.
  3. У вас может быть один шаблон EditorTemplate / DisplayTemplate для типа данных, и он будет просто no-op, если не используется в элементе в списке.

Единственным недостатком является то, что если корень связанная с моделью, является перечислимой (т. е. параметром самого метода Action, а не просто чем-то еще глубже в графе объектов параметров), привязка завершится неудачно при первом непересекающемся индексе. К сожалению, функциональность .Index для DefaultModelBinder работает только для объектов без полномочий root. В этом случае ваш единственный вариант остается использовать вышеприведенные подходы.

5
ответ дан Phil Degenhardt 27 August 2018 в 08:04
поделиться

Или используйте эту функцию javascript, чтобы исправить индексирование: (Замените имя EntityName и поле NameName очевидно)

function fixIndexing() {
        var tableRows = $('#tblMyEntities tbody tr');

        for (x = 0; x < tableRows.length; x++) {
            tableRows.eq(x).attr('data-index', x);

            tableRows.eq(x).children('td:nth-child(1)').children('input:first').attr('name', 'EntityName[' + x + "].FieldName1");

            tableRows.eq(x).children('td:nth-child(2)').children('input:first').attr('name', 'EntityName[' + x + "].FieldName2");

            tableRows.eq(x).children('td:nth-child(3)').children('input:first').attr('name', 'EntityName[' + x + "].FieldName3");
        }

        return true; //- Submit Form -
    }
1
ответ дан SlimSjakie 27 August 2018 в 08:04
поделиться

В итоге я создал более общий HTML-помощник: -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;

namespace Wallboards.Web.Helpers
{
    /// <summary>
    /// Hidden Index Html Helper
    /// </summary>
    public static class HiddenIndexHtmlHelper
    {
        /// <summary>
        /// Hiddens the index for.
        /// </summary>
        /// <typeparam name="TModel">The type of the model.</typeparam>
        /// <typeparam name="TProperty">The type of the property.</typeparam>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <param name="expression">The expression.</param>
        /// <param name="index">The Index</param>
        /// <returns>Returns Hidden Index For</returns>
        public static MvcHtmlString HiddenIndexFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, int index)
        {
            var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            var propName = metadata.PropertyName;

            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("<input type=\"hidden\" name=\"{0}.Index\" autocomplete=\"off\" value=\"{1}\" />", propName, index);

            return MvcHtmlString.Create(sb.ToString());
        }
    }
}

И затем включил его в каждую итерацию элемента списка в вашем представлении Razor: -

@Html.HiddenIndexFor(m => m.ExistingWallboardMessages, i)
1
ответ дан Stephen Garside 27 August 2018 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: