Как использовать динамические входные данные MVC4 в формате Html

#c# #ajax #asp.net-mvc #asp.net-mvc-4

#c# #ajax #asp.net-mvc #asp.net-mvc-4

Вопрос:

Я новичок в MVC и использую MVC4. У меня есть серия каскадных выпадающих списков, которые я заполняю вызовами AJAX. Заказчик> Семейство> Сборка — сборка определяет, сколько балунов (объектов с атрибутами) Мне нужно, чтобы пользователь заполнял, количество объектов Baluns зависит от требований к этой сборке.

Я создал отдельный объект для каждого элемента и viewmodel для этого представления. Затем я передаю listOfBaluns в частичное представление для перебора и создания HTML-кода для любого необходимого количества.

Когда я отправляю форму, я всегда вижу только атрибуты 1-го объекта Balun. Насколько я понимаю, я правильно использую частичное представление для перебора списка объектов Balun, но они не отображаются в сообщении ни для FormCollection, ни в Request.Form.

В коде, который я включил, я просто тестирую, могу ли я заставить работать 2 балуна, это должно объяснить, почему я явно добавляю 2 балуна в список в модели представления.

Любая помощь будет оценена.

Вот представление —

 @model Nortech_Intranet.ViewModels.BalunTuningEntryViewModel
@using Nortech_Intranet.Models.BalunModels

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <div class="whiteBodyContainer">
        @*Text Entry fields*@
        <table style="margin: auto;">
            <tr>
                <th>
                    @Html.LabelFor(model => model.balunTuningRecord.Start_Timestamp)
                </th>
                <td>
                    @Html.TextBoxFor(model => model.balunTuningRecord.Start_Timestamp, new { @Value = @System.DateTime.Now } )
                </td>
                <th>
                    @Html.LabelFor(model => model.balunTuningRecord.Work_Order)
                </th>
                <td>
                    @Html.TextBoxFor(model => model.balunTuningRecord.Work_Order)
                </td>
                <th>
                    @Html.LabelFor(model => model.balunTuningRecord.Serial_Number)
                </th>
                <td>
                    @Html.TextBoxFor(model => model.balunTuningRecord.Serial_Number)
                </td>
            </tr>
        </table>
        <hr />    

        <table style="margin: auto;">
            <tr>
                @Html.Partial("_RenderBalun", Model.balunList)
            </tr>
        </table>
    </div>

    <p>
        <input type="submit" value="Create Tuning Record" />
    </p>
}
 

ViewModel —

 using Nortech_Intranet.Models.BalunModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Nortech_Intranet.ViewModels
{
    public class BalunTuningEntryViewModel
    {
        public List<Customer> customerList { get; set; }
        public List<Family> familyList { get; set; }
        public List<Assembly> assemblyList { get; set; }
        public List<NWAnalyzerModel> nwAnalyzerModelList { get; set; }
        public List<NWAnalyzerCAL_ID> nwAnalyzerCAL_IDList { get; set; }
        public List<TestUser> testUserList { get; set; }
        public List<BalunRecord> balunList { get; set; }

        public BalunTuningRecord balunTuningRecord { get; set; }

        public BalunTuningEntryViewModel() : base ()
        {
            balunList = new List<BalunRecord>();

            BalunRecord newRecord = new BalunRecord();
            balunList.Add(newRecord);
            BalunRecord newRecord2 = new BalunRecord();
            balunList.Add(newRecord2);
        }

        public BalunTuningEntryViewModel(int i)
        {
            balunList = new List<BalunRecord>();

            for (int counter = 0; counter < i; counter  )
            {
                BalunRecord newRecord = new BalunRecord();
                balunList.Add(newRecord);
            }
        }
    }
}
 

Частичный просмотр —

 @model IEnumerable<Nortech_Intranet.Models.BalunModels.BalunRecord>
@using Nortech_Intranet.Models.BalunModels

@{
    int counter = 1;
    foreach(BalunRecord record in Model)
    {
    <td>
        <table id="@("tblBalun" @counter)"  style="border: 2px solid gray; visibility: collapse;">
            <tr>
                <th colspan="2" style="text-align: center;"><label>Balun #@counter</label></th>
            </tr>
            <tr>
                <th>
                    @Html.LabelFor(model => record.Tuning_Cap_1)
                </th>
                <td>
                    @Html.TextBoxFor(model => record.Tuning_Cap_1, new { id = "ddlBalun"   @counter   "Cap"   "1" })
                </td>
            </tr>
            <tr>
                <th>
                    @Html.LabelFor(model => record.Tuning_Cap_2)
                </th>
                <td>
                    @Html.TextBoxFor(model => record.Tuning_Cap_2, new { id = "ddlBalun"   @counter   "Cap"   "2" })
                </td>
            </tr>
        </table>
    </td>       

        counter = counter   1;
    }
}
 

Комментарии:

1. Почему бы вам не упростить код и не показать только минимум, необходимый для понимания проблемы? Я думаю, что проблему нетрудно решить, но никто не собирается пересматривать так много кода. По крайней мере, я. Купите способ: слишком много тестов, слишком много кода, но ваша проблема совсем не ясна. Тонны кода и… где действие контроллера?

2. Я старался быть как можно более подробным, но хорошее предложение, я сократил код, так что теперь из него вырезан весь жир. Спасибо за предложение.

Ответ №1:

Я понял это, решение состояло в том, чтобы выполнить цикл и использовать индексацию для модели. Вот новый раздел в представлении, который решил проблему —

 @{
    var counter = 1;
    for (int i = 0; i < Model.balunList.Count; i  )
    {
    <td>
    <table id="@("tblBalun"   @counter)"  style="border: 2px solid gray; visibility: collapse;">
        <tr>
            <th colspan="2" style="text-align: center;"><label>Balun #@counter</label></th>
        </tr>
        <tr>
            <th>
                @Html.LabelFor(model => model.balunList[i].Tuning_Cap_1)
            </th>
            <td>
                @Html.TextBoxFor(model => model.balunList[i].Tuning_Cap_1, new { id = "ddlBalun"   @counter   "Cap"   "1" })
            </td>
        </tr>
        <tr>
            <th>
                @Html.LabelFor(model => model.balunList[i].Tuning_Cap_2)
            </th>
            <td>
                @Html.TextBoxFor(model => model.balunList[i].Tuning_Cap_2, new { id = "ddlBalun"   @counter   "Cap"   "2" })
            </td>
        </tr>
    </table>
    </td>
        counter  ;
    }   
}