Display the same page after saving

2019-04-27 01:09发布

问题:

I'd like show a form with some field (one in the example), submit it, save and display the same page with a reset of all fields. The probelm when I submit, I go the "Save" action but when I display the view the form is still filled in.

The model :

public class TestingModel
{
    public string FirstName { get; set; }
}

The controller :

    public class ChildController : Controller
{
    public ActionResult Index()
    {
        TestingModel model = new TestingModel();
        return View(model);
    }

    public ActionResult Save(TestingModel model)
    {
         Console.WriteLine(model.FirstName); //OK

        //Save data to DB here ...          

        TestingModel testingModel = new TestingModel() { FirstName = string.Empty };
        return View("Index", testingModel);
    }
}

The view :

@using (Html.BeginForm("Save", "Child",FormMethod.Post))
{
    @Html.TextBoxFor( m => m.FirstName)
   <input type="submit" id="btSave" />
}

When Id debug to the view, in "Immediat window" Model.FirstName = "" but when the page is show I still have the value posted. I tried a ReditrectionToAction("Index") at the end of the Save method but same result.

Do you have an idea ?

Thanks,

回答1:

If you want to do this you need to clear everything that's in the ModelState. Otherwise HTML helpers will completely ignore your model and use data from ModelState when binding their values.

Like this:

[HttpPost]
public ActionResult Save(TestingModel model)
{
    //Save data to DB here ...          

    ModelState.Clear();
    TestingModel testingModel = new TestingModel() { FirstName = string.Empty };
    return View("Index", testingModel);
}

or simply redirect to the Index GET action in case of success:

[HttpPost]
public ActionResult Save(TestingModel model)
{
    //Save data to DB here ...          
    return RedirectToAction("Index");
}


回答2:

Try to return Index view without any model

  return View("Index");


回答3:

You should be posting your form back to the same ActionResult

public ActionResult Index()
    {
        TestingModel model = new TestingModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(TestingModel model)
    {
         Console.WriteLine(model.FirstName); //OK

        //Save data to DB here ...          


        return RedirectToAction("Index");
    }

You would be able to use the parameterless overload for BeginForm too

@using(Html.BeginForm())
{
   //form
}