我正在寻找一种方法(如果有的话)在post方法上使模型绑定过程与List对象一起使用。 我可以轻松显示列表。但是当用户使用post方法上传“Bien”时,我无法使框架正确绑定每个列表元素。你可以看到我尝试制作标签和文本框的页面部分,因为我不断得到异常,所以我想我做错了,我无法找到一种方法在我的模型上传可变数量的参数。
这是模特:
public class BienModel
{
[Required]
[Display(Name = "Nombre del Bien.")]
public String Nombre { set; get; }
public List<Atributo> Atributos { set; get; }
}
public class Atributo
{
[Required]
public String nombre { set; get; }
[Required]
public String valor { set; get; }
public Atributo(){}
public Atributo(String n, String v){
this.nombre=n;
this.valor=v;
}
}
这是页面:
@using (Html.BeginForm()) {
<fieldset>
<legend>Publicar bien form.</legend>
<ol>
<li>
@Html.LabelFor(m => m.Nombre)
@Html.TextBoxFor(m => m.Nombre)
@Html.ValidationMessageFor(m => m.Nombre)
</li>
@*@for (int i = 0; i < Model.Atributos.Count;i++ )
{
@Html.Label(Model.Atributos[i].nombre)
@Html.TextBoxFor(m => m.Atributos[i].valor)
@Html.ValidationMessageFor(m => m.Atributos[i].valor)
}*@
</ol>
<input type="submit" value="Publicar!" />
</fieldset>
}
这就是控制器
public ActionResult PublicarBien()
{
//Pido a la logica los atributos
BienModel b = new BienModel();
b.Atributos = new List<Atributo>();
b.Atributos.Add(new Atributo("Atributo1", ""));
b.Atributos.Add(new Atributo("Atributo2", ""));
b.Atributos.Add(new Atributo("Atributo3", ""));
b.Atributos.Add(new Atributo("Atributo4", ""));
return View(b);
}
[HttpPost]
public ActionResult PublicarBien(BienModel b)
{
try
{
if (ModelState.IsValid)
{
//se da de alta el bien
return RedirectToAction("Index", "Home");
}
}
catch(Exception ex){
ModelState.AddModelError("",ex.Message);
}
return View(b);
}
答案 0 :(得分:10)
您的代码似乎很好。如果您要发布的控制器操作采用BienModel
作为操作参数,则绑定应该正常工作:
[HttpPost]
public ActionResult SomeAction(BienModel model)
{
...
}
您还可以查看有关ASP.NET MVC中标准约定的following article
以绑定到列表。
目前,您只有valor
属性的输入字段。 nombre
属性没有相应的输入字段,因此您永远不会获得其值。如果您希望这样做,您可以使用隐藏字段:
@for (int i = 0; i < Model.Atributos.Count;i++ )
{
@Html.LabelFor(x => x.Atributos[i].valor, Model.Atributos[i].nombre)
@Html.HiddenFor(m => m.Atributos[i].nombre)
@Html.TextBoxFor(m => m.Atributos[i].valor)
@Html.ValidationMessageFor(m => m.Atributos[i].valor)
}