用post方法绑定Asp mvc 4模型

时间:2013-04-14 20:05:23

标签: 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;
        }


    }

这是页面:

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

1 个答案:

答案 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)
}