Search code examples
asp.net-corebindingrazor-pagesasp.net-core-3.1model-binding

Razor page: complex modeling binding not updating model


So I'm trying to create a little tool where a user can select a set of days. I however need quite a complex model for extra data.

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;
    }
}

My Razorpage looks like this:

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

</form>

My method Registerselection looks like this:

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

However, whenever I change any of textboxes, all of the selected bool values remain the same. Can anybody help me on my way? Thanks in advance!


Solution

  • Here is a demo to pass data to action correctly:

    Model:

    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;
            }
        }
    

    View:

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

    result: enter image description here