MVC Razor View: Как отобразить список текстовых полей для List <Task>в модели? - PullRequest
3 голосов
/ 26 мая 2011

У меня есть List<Task> в моей модели. Этот список содержит 2 задачи (скажем) в нем

public List<Task> Tasks { get; set; }

public class Task    {
    public Task()
    {
        Title="";
        Total= 0;
    }

    public string Title{ get; set; }

    public int Total{ get; set; }
}

Теперь в моем виде бритвы я хочу сделать 2 текстовых поля для каждого из Tasks в List<Tasks> моей модели.

Я не зацикливался, просто поместил прямые текстовые поля, такие как:

@Html.TextBoxFor(m => m.Tasks[0].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[0].Total, new { @maxlength = "2"})
<br>
@Html.TextBoxFor(m => m.Tasks[1].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[1].Total, new { @maxlength = "2"})

Это прекрасно обрабатывает форму, но нажатие кнопки «Отправить» ничего не делает в FF. Однако в IE9 все нормально.

Просмотр источника показывает этот HTML, сгенерированный следующим образом:

<input id="Tasks_0__Title" maxlength="50" name="Tasks[0].Title" type="text" value="" />
<input data-val="true" data-val-number="The field Total must be a number." data-val-required="The Total field is required." id="Tasks_0__Total" maxlength="2" name="Tasks[0].Total" type="text" value="" /> 

Этот HTML-код выглядит неправильно. У него name="Tasks[0].Total", что кажется странным.

Как мне сделать это, чтобы я мог получить доступ к значениям текстового поля из List<> в моем контроллере после публикации?

Спасибо

EDIT: Я просто оставил один ряд для теста. Это HTML, который я вижу в FF.

<input id="Tasks_0__Title" type="text" value="" name="Tasks[0].Title" maxlength="50">
<input id="Tasks_0__Total" type="text" value="" name="Tasks[0].Total" maxlength="2" data-val-required="The Total field is required." data-val-number="The field Total must be a number." data-val="true">

Это сообщение не публикуется, когда я нажимаю кнопку отправки.

Теперь, если я изменюсь name="Tasks[0].Title" to name="Tasks_0__Title" and name="Tasks_0__Total" в FIREBUG это хорошо.

Если я удаляю имя полностью, оно также публикуется нормально в FF

Ответы [ 2 ]

5 голосов
/ 26 мая 2011

Вы должны использовать Tasks[0].Total и Tasks[1].Total вместо Items:

@Html.TextBoxFor(m => m.Tasks[0].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[0].Total, new { @maxlength = "2"})
<br/>
@Html.TextBoxFor(m => m.Tasks[1].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[1].Total, new { @maxlength = "2"})

name="Tasks[0].Total" не является странным.Именно так должны быть названы входные данные, чтобы связыватель модели мог получить значение обратно в действии POST.См. в этом посте формат проводов, используемый механизмом связывания моделей по умолчанию при работе со списками и словарями.

При этом я рекомендую использовать шаблоны редактора => вместо написания этих 5строки кода в вашем представлении заменяют их на:

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

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

@model Task
@Html.TextBoxFor(m => m.Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Total, new { @maxlength = "2"})    
<br/>

Теперь вы можете оставить шаблоны редакторов беспокоиться о правильном соглашении об именах и т.д ...

Что касается действия POST:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    // model.Tasks should be correctly bound here
    ...
}
0 голосов
/ 23 марта 2019

Если вы хотите иметь несколько элементов с текстовыми полями.

 for (int i = 0; i < Model.Students.Count; i++)
                            {
                                @Html.HiddenFor(modelIem => Model.Students[i].StudentId)

                                <tr>
                                    <td>
                                        @Html.DisplayFor(modelItem => Model.Students[i].Student.FirstNames)
                                    </td>
                                    <td>
                                        @Html.DisplayFor(modelItem => Model.Students[i].Student.LastNames)
                                    </td>
                                    <td>
                                        @Html.TextBoxFor(modelItem => Model.Students[i].Score, new { @type = "number" })
                                    </td>
</tr> }

Это ViewModel

public class MyModel 
{
 public List<StudentGrade> Students { get; set; }
    }

    public class StudentGrade {
        public ApplicationUser Student { get; set; }
        [Range(1, 100)]
        public int? Score { get; set; } = null;
        public string Description { get; set; } = null;
        public string StudentId { get; set; }
    }

В конце это будет выглядеть так. enter image description here

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