2015-05-11 2 views
1

Может кто-нибудь скажет мне, как мне передать списки выбранных релевантных значений скрытого поля из контроллера. Выбранное поле возвращает значение Boolean (true). Есть более 100 элементов списка. Если администратор выбирает (присваивает) список и отправляет, он передает все значения списка, передаваемые контроллеру и обновляя базу данных.Пропустить списки выбранного релевантного значения скрытых полей форме на контроллер

Это мой взгляд кодовой страницы CHTML:

@using (Html.BeginForm("CAssigned", "Orders", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @foreach (var item in Model) 
    { 
     @Html.HiddenFor(model => item.LocationId) 
     <td> 
      @Html.DisplayFor(modelItem => item.MapIcons) 
      @Html.HiddenFor(model => item.MapIcons,"MapIcons") 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.Assigned) 
      @Html.HiddenFor(model => item.Assigned) 
     </td> 
    } 
    <input type="Submit" value="Select" /> 
} 

Мой контроллер

[HttpGet] 
    public ActionResult CAssigned() 
    { 
     var orders = db.Locations.ToList(); 
     return View(orders); 
    } 

    [HttpPost] 
    public ActionResult CAssigned(IEnumerable<Location>) 
    { 
    return View(); 
    } 

просмотреть исходный код HTML

<input data-val="true" data-val-number="The field LocationId must be a number." data-val-required="The LocationId field is required." id="item_LocationId" name="item.LocationId" type="hidden" value="1" /> 
<td> 
    red-dot.png 
    <input Length="8" id="item_MapIcons" name="item.MapIcons" type="hidden" value="red-dot.png" /></td> 
<td> 
<input class="check-box" data-val="true" data-val-required="The Assigned to Courier field is required." id="item_Assigned" name="item.Assigned" type="checkbox" value="true" /><input name="item.Assigned" type="hidden" value="false" /> 
<input type="Submit" value="Select" /> 
<input id="item_Assigned" name="item.Assigned" type="hidden" value="False" /> 
<td> 
+0

Вы не можете использовать цикл 'foreach' для привязки к коллекции (вы генерируете повторяющиеся атрибуты' id' (недействительные html) и 'name', которые не имеют отношения к вашей модели (без индексаторов). Вам нужно использовать цикл 'for' или пользовательский' EditorTemplate' для модели. В любом случае, почему у вас есть скрытый ввод для свойства 'Assigned', который будет просто проигнорирован, так как у вас есть n 'EditorFor()' для того же свойства. И ваш метод POST-метода должен быть вашей моделью ('public ActionResult CAssigned (IEnumerable )', так как это то, на чем основан ваш взгляд. –

+0

Спасибо за ваш повтор. @for (var i = 1; i Rob

+0

Ваша модель должна реализовать 'IList', а затем' for (int i = 0; i m [i] .LocationId ....} ', который будет генерировать' ',' "и т. д. См. также [этот ответ] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943) для получения более подробной информации –

ответ

1

Использование цикла Еогеасп не создает правильное имя атрибуты, необходимые для привязки к коллекции, и вам необходимо использовать for или произвольный EditorTemplate для typeof Location, так что элементы управления формой включают в себя индекс. Обратитесь к this answer за более подробной информацией о том, как должны быть названы элементы управления формой для коллекции, а также для использования EditorTemplate.

Чтобы использовать цикл, просматривать потребности быть

@model IList<yourAssembly.Location> 
@using (Html.BeginForm()) // no need to add the parameters since you posting to the same method 
{ 
    <table> 
    for(int i = 0; i < Model.Count; i++) 
    { 
     <tr> 
     <td> 
      @Html.HiddenFor(m => m[i].LocationId) 
      @Html.HiddenFor(m => m[i].MapIcons) 
      @Html.DisplayFor(m => m[i].MapIcons) 
     </td> 
     <td> 
      @Html.CheckBoxFor(m => m[i].Assigned) 
     </td> 
     </tr> 
    } 
    </table> 
    <input type="Submit" value="Select" /> 
} 

и проводке метод подписи должен быть (добавить имя параметра)

[HttpPost] 
public ActionResult CAssigned(IEnumerable<Location> model) 

Боковые ноты:

  1. Удалить скрытый ввод для объекта Assigned. Вы уже генерироваться флажок (и связанный скрытый ввод) для собственности так было бы просто игнорировать на постбэка все равно
  2. <input> не является допустимым дочерним элементом <tr> элемента, поэтому убедитесь, что включить их внутри <td>
+0

Спасибо за код, у меня есть один вопрос [HttpPost] public ActionResult CAssigned (IEnumerable ) {return View() }. Почему возникла ошибка? Ошибка Идентификатор ожидается "? Что мне нужно изменить на моем контроллере? – Rob

+0

У меня есть вопрос с правильной настройкой - как и любой метод, вам нужно определить тип и имя для параметра - в том случае, если вы включили только тип - 'IEnumerable ' - но опустили имя параметра –

+0

. этот контроллер [HttpPost] public ActionResult CAssigned (Location location) { \t \t возвращение Вид(); \t { – Rob

Смежные вопросы