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