Cri*_*lho 3 asp.net-mvc post model model-binding
我正在寻找一种方法(如果有的话)在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是页面:
@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>
}
Run Code Online (Sandbox Code Playgroud)
而这个控制器
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);
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 10
你的代码似乎很好.如果您要发布的控制器操作采用BienModelas操作参数,则绑定应该正常工作:
[HttpPost]
public ActionResult SomeAction(BienModel model)
{
...
}
Run Code Online (Sandbox Code Playgroud)
您还可以查看following articleASP.NET MVC中有关绑定到列表的标准约定.
目前,您只有该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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13861 次 |
| 最近记录: |