2014-06-29 3 views
0

у меня есть это в мой контроллер:ViewModel не проводки назад

public ActionResult Index() 
{ 
    var viewModels = _dataSyncService.Get().Select(provider => new IndexViewModel 
    { 
     Selected = false, Provider = provider 
    }).ToList(); 

    return View(viewModels); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index(IEnumerable<IndexViewModel> viewModels) 
{ 
    //Breakpoint on this to check viewModels 
} 

ViewModel:

public class IndexViewModel 
{ 
    public bool Selected { get; set; } 

    public IDataSyncProvider Provider { get; set; } 
} 

И мой Index.cshtml:

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

    <button type="submit" class="btn blue">Trigger Selected</button> 

    @foreach (var sync in Model) 
    { 
     <tr> 
      <td> 
       @Html.CheckBoxFor(s => sync.Selected) 
      </td> 
      <td>@sync.Provider.FriendlyName</td> 
     </tr> 
    } 
} 

Но мои модели вывешены назад, viewModels всегда возвращается как null. Я много читал о необходимости присваивать идентификатор флажку и т. Д., Но я думал, что это то, что для Html.CheckBoxFor.

Я уверен, что в какой-то момент я буду себя обманывать, но я мог бы сделать некоторые указания, пожалуйста.

ответ

2

Если вы хотите использовать встроенный в Html помощников как Html.CheckBoxFor, то вам нужно использовать for петлю вместо foreach, чтобы помощники делают правильные имена ввода:

@for(int sync = 0; sync < Model.Count; sync++) 
{ 
    <tr> 
     <td> 
      @Html.CheckBoxFor(m => Model[sync].Selected) 
     </td> 
     <td>@Model[sync].Provider.FriendlyName</td> 
    </tr> 
} 

Вы можете прочитать больше о привязке к спискам здесь: Model Binding To A List

+0

А, примеры, которые я видел, это так, но я думал, что это их предпочтение. Я отдам его. – webnoob

+0

Это не предпочтение. Если вы хотите привязать к коллекции, входные имена должны следовать схеме, как описано в связанной статье. И помощники генерируют эти имена только в том случае, если вы используете в них индекс индекса массива. Таким образом, вы все равно можете использовать 'foreach', если вы поддерживаете отдельный индекс и используете индексатор в хелперах, но в этом случае' foreach' не покупает вам ничего, поэтому вам проще идти с простым циклом 'for'. – nemesv

+0

Отлично, теперь он отсортировал обратную передачу (например, Selected = true, когда отмечено и отправлено назад), однако часть «Provider» моей модели ViewModel не отправляется обратно. Ты знаешь почему? Я попытался добавить '@ Html.HiddenFor (m => Model [i] .Provider)', но это, похоже, не помогло. p.s Я проверил ViewModel, когда он назначен для представления, и он отправляется Хорошо. – webnoob

-1

Это потому, что вы просто перенаправляете его, используя return RedirectToAction («Index»);

В вашем действии POST

попробовать:

Надежда поможет.

+0

Я отредактировал свой пост, поскольку он obviusly не был ясен. У меня есть точка останова в этой части, и я проверяю переменную 'viewModels' перед перенаправлением. – webnoob

+0

Это не имеет никакого отношения к проблеме OP, как указано в комментариях, код 'return RedirectToAction' был всего лишь примером. – nemesv

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