Reputation: 706
In my app I want to make model that can have dynamic list of attributes:
Provider class
using System;
using System.Collections.Generic;
namespace DynamicForms.Models
{
public class Provider
{
public String Name { get; set; }
public List<Attribute> Attributes { get; set; }
public Provider()
{
Attributes = new List<Attribute>();
}
}
}
My controller has two methods. One to add more attributes to current model and one to save Provider model. Method to add more attributes looks like this:
[HttpPost]
// Add attribute to current provider model
public IActionResult Index(Provider provider)
{
provider.Attributes.Add(new Models.Attribute());
return View(provider);
}
And my view looks like this:
@model Provider
@using (Html.BeginForm())
{
<div>
@Html.TextBoxFor(m => m.Name)
<input type="submit" value="Add attribute" formmethod="post"/>
</div>
<div>
@foreach ( var attribute in Model.Attributes)
{
<div>
@Html.TextBoxFor(a => attribute.Name)
@Html.TextBoxFor(a => attribute.Value)
</div>
}
</div>
<div>
<input type="submit" value="Save form" formaction="Provider/Save" formmethod="post"/>
</div>
}
When I press "Add attribute" button attribute is added and a row of input fields is appearing. However when i press the button one more time nothing happens. No another row is added. Model attributes count is still 1. I've been looking for solutions all over the web but couldn't find anything that fixes my problem. How can I make form fields be added dynamically to model and displayed in vieW?
Upvotes: 3
Views: 11467
Reputation: 4282
Try looping over your List with an index instead of foreach, e.g.
@for (var i = 0; i < Model.Attributes.Count; i++)
{
<div>
@Html.TextBoxFor(a => Model.Attributes[i].Name)
@Html.TextBoxFor(a => Model.Attributes[i].Value)
</div>
}
You want the names to be formatted something like this Attributes[0].Name, etc.
Upvotes: 4
Reputation: 11
You wrote a method for Post, but you wrote a method for get.
Get method
public IActionResult Index()
{
Provider provider = new Provider();
provider.Attributes.Add(new Models.Attribute());
return View(provider);
}
Post metod
[HttpPost]
// Add attribute to current provider model
public IActionResult Index(Provider provider)
{
provider.Attributes.Add(new Models.Attribute());
return View(provider);
}
Upvotes: -2