Страница Razor: привязка сложного моделирования без обновления модели

#asp.net-core #binding #razor-pages #asp.net-core-3.1 #model-binding

Вопрос:

Поэтому я пытаюсь создать небольшой инструмент, с помощью которого пользователь может выбрать набор дней. Однако мне нужна довольно сложная модель для дополнительных данных.

 public class DayRange{
    ...
    List<DaySelected> Days
    ...
}
   
public class DaySelected{
    public bool Selected{ get; set;}
    public string DayName {get; set;}
    public DaySelected(string Day){
        Selected = false;
        DayName = day;
    }
}
 

Моя бритвенная страница выглядит так:

 @Model DayRange
...
<form asp-action="RegisterSelection" asp-controller="DayRegister">
<table>
@foreach (var Day in Model.Days)
{
    <tr>
        <td>
            <input asp-for=@Day.Selected />
        </td>                                                            
    </tr>
}
</table>
<button type="submit">Confirm</button>

</form>
 

Мой метод Registerselection выглядит следующим образом:

 [HttpPost]
public IActionResult RegisterSelection(DayRange dr){
    ...
}
 

Однако всякий раз, когда я изменяю какое-либо из текстовых полей, все выбранные значения bool остаются прежними. Кто-нибудь может помочь мне в моем пути? Заранее спасибо!

Ответ №1:

Вот демонстрационная версия для правильной передачи данных в действие:

Модель:

 public class DayRange
    {
        public List<DaySelected> Days { get; set; }
    }

    public class DaySelected
    {
        public bool Selected { get; set; }
        public string DayName { get; set; }
        public DaySelected()
        {
           
        }
        public DaySelected(string Day)
        {
            Selected = false;
            DayName = Day;
        }
    }
 

Вид:

 @Model DayRange
<form asp-action="RegisterSelection" asp-controller="DayRegister">
    <table>
        @{ var i = 0;}
        @foreach (var Day in Model.Days)
        {
            <tr>
                <td>
                    <input asp-for=@Day.Selected name="Days[@i].Selected" />
                    @Day.DayName
                    <input asp-for=@Day.DayName name="Days[@i].DayName" hidden />
                </td>
            </tr>
            i   ;
        }
    </table>
    <button type="submit">Confirm</button>

</form>
 

Результат:
введите описание изображения здесь

Комментарии:

1. Спасибо за демонстрацию! Я смог заставить это работать сейчас, поэтому я принял ваш ответ как решение этой проблемы. Мне просто интересно, была ли причина, по которой это не сработало, просто потому, что я не заполнил названия компонентов флажков? Мои извинения за простой вопрос, это в основном ново для меня.

2. Да,.net core связывает данные с атрибутом name.