Search code examples
c#razorasp.net-core-mvcrazor-pages

Selected item in ASP.NET Core razor not being passed


I'm using ASP.NET Core Razor for the first time. I'm trying to simply set a bound property with the selected value of a dropdown but the property is always null when the form is posted. Also, how does one get the form posted when a selection is made? TIA

Razor page:

<td>
    <form method="post">
        <select asp-for="@Model.selectedReport" asp-items="@Model.Reports" class="form-control">
        </select>
    </form>
</td>

Code behind:

public class SubscribedReportsModel : PageModel
{
    [BindProperty] 
    public List<SelectListItem> Workspaces { get; private set; }

    [BindProperty] 
    public List<SelectListItem> Reports { get; private set; }

    [BindProperty] 
    public string selectedReport { get; set; }

    public async Task OnGetAsync()
    {
        await GetWorkspaces();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        if (selectedReport != null)
        {
            return Page();
        }

        return RedirectToPage("./Index");
    }
}

Solution

  • I'm a bit rusty it appears. All I had to do was add onchange="this.form.submit()" to the control:

                        <td>
                        <form method="post">
                        <select asp-for="@Model.selectedReport" asp-items="@Model.Reports" class="form-control" onchange="this.form.submit()">
                                    </select>
                            @*@Html.DropDownList("ddl_Reports", Model.Reports, new {@class="form-control"})*@
                            @*@Html.DropDownListFor(m => m.selectedReport, Model.Reports, "--Select Report--", new{@class="form-control"})*@
                        </form>
                    </td>