2013-04-14 53 views
3

即时通讯寻找一种方法(如果有的话),以使模型绑定过程与对象列表一起使用,在后期方法上。 我可以很容易地显示列表。但是,当涉及到用户上传一个“Bien”与post方法我不能让框架正确绑定每个列表元素。你可以看到页面部分,我尝试使标签和文本框被评论,因为我不断收到异常,所以我想即时通讯做错了,我无法找到一种方法来上传我的模型上的可变数量的参数。Asp mvc 4模型绑定post方法

这是型号:

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); 
    } 

回答

10

您的代码似乎罚款。如果您正在发布到控制器动作需要BienModel作为动作参数,然后结合应该很好地工作:

[HttpPost] 
public ActionResult SomeAction(BienModel model) 
{ 
    ... 
} 

你也不妨来看看在following article关于ASP.NET MVC的标准惯例绑定到一个列表。

此外,您目前只有valor属性的输入字段。​​属性没有相应的输入字段,因此您将永远无法获得其值。如果你想这样的事情发生,你可以使用一个隐藏字段:

@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) 
} 
+0

的农布雷属性实际上是一个固定值,用户只需输入一个勇敢的财产,农布雷从GET方法,然后将模型回装到视图,但我不断收到空指针异常。 – user1777914

+0

你的代码在哪一行得到这些异常?它是否在POST操作中?或者,也许在之后呈现的视图内?如果您不提供有关遇到的问题的任何详细信息,则无法帮助您。 –

+0

我添加了控制器代码。 在这里抛出异常:@ Html.Label(Model.Atributos [i] .nombre)当我按下发送按钮。 – user1777914