Размещение в списке <modeltype>MVC3 - PullRequest
18 голосов
/ 16 февраля 2012

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

Итак, моя модель имеет список объектов WeightEntry.

Модель для упражнений

public class Exercise
{
    public List<WeightEntry> Entries { get; set; }
    public int ExerciseID { get; set; }
    public int ExerciseName { get; set; }
}

Модель WeightEntry

public class WeightEntry
{
    public int ID { get; set; }
    public int Weight { get; set; }
    public int Repetition { get; set; }
}

My View содержит имя ExerciseName и цикл объектов WeightEntry

@model Mymvc.ViewModels.Exercise
...
<span>@Model.ExerciseName</span>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <table class="left weight-record">
        <tr>
            <th>Reps</th>
            <th>Weight</th>
        </tr>
        @foreach (var item in Model.Entries)
        {
            <tr>
                <td>
                    @Html.EditorFor(x => item.Repetition)
                </td>
                <td>
                    @Html.EditorFor(x => item.Weight)
                </td>
            </tr>
        }
    </table>
    <input type="submit" value="Save" /> 
}

Действие контроллера (сообщение) в данный момент ничего не делает. Я просто пытаюсь заставить работать привязку, прежде чем добавить код сохранения.

[HttpPost]
public ActionResult WeightEntry(Exercise exercise)
{
    try
    {
        //Add code here to save and check isvalid    
        return View(exercise);
    }
    catch
    {
        return View(exercise);
    }
}

Я видел несколько маленьких хитростей с добавлением числителя к именам элементов формы, используемых в MVC2, но мне было интересно, отличался ли MVC3 от других? Я надеялся, что все будет хорошо привязано к ID, равному 0 или нулю, но вместо этого весь список будет нулевым, когда я проверяю его после публикации формы. Любая помощь приветствуется. Спасибо.

1 Ответ

40 голосов
/ 16 февраля 2012

Замените следующий цикл:

@foreach (var item in Model.Entries)
{
    <tr>
        <td>
            @Html.EditorFor(x => item.Repetition)
         </td>
         <td>
             @Html.EditorFor(x => item.Weight)
         </td>
     </tr>
}

на:

@for (var i = 0; i < Model.Entries.Count; i++)
{
    <tr>
        <td>
            @Html.EditorFor(x => x.Entries[i].Repetition)
         </td>
         <td>
             @Html.EditorFor(x => x.Entries[i].Weight)
         </td>
     </tr>
}

или даже лучше, используйте шаблоны редактора и замените цикл на:

@Html.EditorFor(x => x.Entries)

а затем определите пользовательский шаблон редактора, который будет автоматически отображаться для каждого элемента коллекции Entries (~/Views/Shared/EditorTemplates/WeightEntry.cshtml):

@model WeightEntry
<tr>
    <td>
        @Html.EditorFor(x => x.Repetition)
     </td>
     <td>
         @Html.EditorFor(x => x.Weight)
     </td>
 </tr>

Сгенерированные элементы ввода будут иметь правильные имена ивы сможете успешно получить их обратно в действии POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...