Передача целочисленных значений IENumerable в контроллер через ViewModel

0

модели

public class IntegerList
{
    public int IntegerListID { get; set; }
    public string Direction { get; set; }
    public long Performance { get; set; }
    public virtual ICollection<Integer> Integers { get; set; }
}

public class Integer
{
    public int IntegerID { get; set; }
    [Required(ErrorMessage = "An integer is Required")]
    [Range(0, 9999999, ErrorMessage = "Enter an integer")]
    public int IntegerValue { get; set; }
    public int IntegerListID { get; set; }
    public virtual IntegerList IntegerList { get; set; }
}

Вышеупомянутые модели предназначены для приложения, которое сортирует диапазон целых чисел в порядке возрастания или убывания и вычисляет время, затраченное на выполнение сортировки.

Целые числа вводятся в текстовые поля пользователем, который может добавлять или удалять их с помощью jquery.

У меня есть приложение, работающее, передавая formcollection контроллеру, разделяя цепочку целых чисел на массив целочисленных значений, добавляемых в IntegerList.Integers.

Тем не менее, я ищу более элегантное строго типизированное решение.

ViewModel

public class IntegerViewModel
{
    [UIHint("Integers")]
    public IEnumerable<Integer> Integers { get; set; }
    public string Direction { get; set; }
}

Там, где я изо всех сил стараюсь добавить в представление Integers.IntegerValues, чтобы они могли быть переданы контроллеру через viewmodel. Мне также нужно увеличивать/уменьшать каждое значение текстового поля IntegerValue, поскольку оно добавляется/удаляется jquery. Я не уверен, что приближаюсь к этому под прямым углом.

Надеюсь, это ясно. Спасибо за вашу помощь.

бритва

    <form method="post">
        <div id="integers">
            @Html.Label("Enter Integers")
            <div class="integer">
                @Html.EditorFor(model => model.Integers)
                <a href="#" id="addInt">Add Integer</a>
            </div>
        </div>
        @Html.Label("Sort Direction")
        <div>
            @Html.DropDownListFor(model => model.Direction, new[] {
                new SelectListItem() {Text = "Ascending", Value = "Ascending"},
                new SelectListItem() {Text = "Descending", Value = "Descending"}
            })

            <input class="button" type="submit" value="Submit" />
        </div>
    </form>

Шаблон редактора (для целых)

@model Integer

@Html.EditorFor(m => m.IntegerValue)
  • 4
    Можешь показать бритву?
  • 3
    Проверьте старую статью Фила Хаака о переплете коллекций. Ваш вопрос не совсем понятен без дополнительного кода, но это должно указать вам правильное направление: haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
Показать ещё 1 комментарий
Теги:
entity-framework
asp.net-mvc

1 ответ

0

Позвольте мне подвести итог всему.

Вы не найдете там строго типизированного решения, поскольку вы добавляете и удаляете значения (целые числа) с помощью JavaScript (jQuery).

Итак, когда вы добавляете целочисленный редактор, используя jquery, вы должны отображать соответствующий HTML в соответствии с контрактами ASP.NET MVC.

Комментарий Дэвида очень ценен. Проверьте эту ссылку. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Здесь вы можете увидеть, как вы должны отображать HTML-код для получения различных типов данных на сервере (действие ASP.NET MVC).

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

И, наконец, вот вопрос о динамических полях формы в ASP.NET MVC. Динамические формы ASP.NET MVC

Надеюсь это поможет.

  • 0
    Спасибо, Андрей. Это помогло. Статья Haacked решает мою проблему очень просто, так как я использую примитивные типы. Точно так же ваше решение нокаута также работает. Но оба используют стандартный HTML, а не бритву. Нужен ли этот компромисс? Мой EditorFor называет мои входные данные "IntegerValues.IntegerValue" и поэтому не распознается ViewModel. Принимая во внимание, что жесткое кодирование имен в HTML как «IntegerValue» прекрасно связывает их с моделью представления. Если я не использую бритву, придется ли мне проверять другой способ? Или я должен настроить шаблон редактора для принятия правильного имени? Я чувствую, что мне придется идти на компромисс.
  • 0
    @ user1405195, возможно, у меня не все, о чем ты говоришь. Но похоже, что вы должны принять какой-то компромисс. Что касается строго типизированного решения и генерации имени: попробуйте использовать @ Html.NameFor (m => m.Field) или @ Html.IdFor (m => m.Field). Эти помощники могут вам немного помочь. И удачи конечно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню