それよりもはるかに簡単です。入力に name='' 規則を追加するだけで、mvc のバインダーが値を取得します。
実際には 2 つのオプションがあります... 1. name="textbox[0].Name" など。2. 独自の Binder を作成し、必要に応じて入力をバインドします。何も再発明する必要はありません。
私の回答を編集するのに時間がかかってすみません、ここに例があります: モデル:
public class Person
{
public Person()
{
InterestList = new List<Interest>();
}
public IList<Interest> InterestList { get; set; }
}
public class Interest
{
public string Name { get; set; }
}
バインダー:
public class InterestListBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
var person = new Person();
foreach (var i in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys)
{
person.InterestList.Add(new Interest
{
Name = controllerContext.RequestContext.HttpContext.Request.Form[i]
});
}
return person;
}
}
バインダーをアタッチする Global.asax
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(Person), new InterestListBinder());
}
}
コントローラー:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Person person)
{
return View("Index", person);
}
}
そして今、ビュー:
@model Data.Services.DataBinders.Person
<div>
<form action="@Url.Action("Index", "Home")" method="POST">
@{
if (Model != null && Model.InterestList.Any())
{
foreach (var tb in Model.InterestList)
{
<input type="text" value="@tb.Name"/>
}
}
}
<input type="button" value="add" id="add" />
<input type="button" value="remove" id="remove" />
<input type="submit" value="Submit" />
</form>
</div>
動的入力を生成する JavaScript には、好きな名前を付けることができます。
<script>
(function ($) {
var demo = {
init: function () {
this.elements = null;
this.cache();
this.bindEvents();
return this;
},
cache: function () {
this.elements = new Array();
},
bindEvents: function () {
$("#add").on("click", this.add);
$("#remove").on("click", this.remove);
},
add: function () {
var self = demo;
var $elem = $("<input type='text' \>");
self.elements.push($elem);
self.render();
},
remove: function () {
var self = demo;
$.each(self.elements, function (index, elem) {
elem.remove();
});
self.elements.splice(0, 1);
self.render();
},
render: function () {
var self = demo;
for (var e in self.elements) {
self.elements[e].attr("name", "Interest" + e);
$("form").append(self.elements[e]);
}
console.log(self.elements);
}
};
window.load = demo.init();
})(jQuery)
</script>