Nikita
Nikita

Reputation: 64

.Net MVC: How to correct <Form> fields in a post request for a different data model?

How can you send a form in a POST request, to another data model (not the one in the view)?

I have UserModel and FilterRequest Models.

To filter the data do I need to post a request to an IndexFilter with a FilterRequest filtering model?

Help Please, how can I do this?

View/User/Index.cshtml

@model UserModel

@using (Html.BeginForm("IndexFilter", "User", FormMethod.Post))
{
    <input type="hidden" name ="pageNumber" value="@Model.PaginationModel.PageNumber"/>

    <div>
        <label>First Name</label>
        @Html.TextBoxFor(m => m.FilterData.FirstName)
    </div>
    <div>
        <label>Last Name</label>
        @Html.TextBoxFor(m => m.FilterData.LastName)
    </div>
    <input type="submit" value="Filter" />
}

UserController.cs

[HttpPost]
public IActionResult IndexFilter([FromBody] FilterRequest request)
{

}

UserModel.cs

public class UserModel
{
    public IList<User> Users{ get; set; }
    
    public PaginationModel PaginationModel { get; set; }

    public FilterData FilterData { get; set; }
}

FilterRequest.cs

public class FilterRequest
{
    public int PageNumber { get; set; } = 1;

    public FilterData FilterData { get; set; }
}

A Post request is sent to the server, with Form Data pageNumber=1&FilterData.FirstName=&FilterData.LastName=Nikita&__RequestVerificationToken=Token The server replied with 415.

Upvotes: 0

Views: 498

Answers (1)

Michael Wang
Michael Wang

Reputation: 4022

Change to [FromForm].

    [HttpPost]
    public IActionResult IndexFilter([FromForm] FilterRequest request)
    {
        //...
        return Ok();
    }

Test Code

public class UserController : Controller
    {
        public IActionResult Index()
        {

            UserModel user = new UserModel()
            {

                PaginationModel = new PaginationModel { PageNumber = 100 },
                FilterData = new FilterData { FirstName = "Ada", LastName = "Michael" }
            };
            return View(user);
        }

        [HttpPost]
        public IActionResult IndexFilter([FromForm] FilterRequest request)
        {
            return Ok();
        }
    }

Screenshot of Debugging

enter image description here

enter image description here

Upvotes: 1

Related Questions