将复杂对象从视图传递到Controller

时间:2017-07-21 19:39:43

标签: c# asp.net-mvc razor request

我有这个型号:

public class MyClassVM
{
public Product MyProduct { get; set; }
public IEnumerable<Dog> MyDogs { get; set; }
}

然后我在控制器中执行此操作:

[HttpPost]
public ActionResult MyAction(MyClassVM)
{
//do something...
}

我有一个html视图,并且已经有一段时间试图绑定对象并将其作为参数从视图发送到控制器但是我还没能...... 这是正确的方法吗?

 <form method="post" action="MyController/MyAction">


   @{ foreach (var dog in Model.MyDogs)
    <tr>
    <td><input type="checkbox" name="[@i].MyDogs" /></td>
    </tr>

}
    <input type="hidden" name="MyProduct" value="@Model.MyProduct"/>
    <input type="submit" value="Submit"/>
    </form>

但是当它到达控制器时总是为空...我已经使用Dev Tools检查了请求并且数据没有被正确绑定。在我看来,我可能需要serialize Json格式的对象???

1 个答案:

答案 0 :(得分:1)

您无法将复杂对象绑定到<input>。两者都发回一个值。

您的复选框如果已选中则会回复"on",如果不是(因为它没有value属性)则不会回复,但不能绑定到Dog类型。如果您检查隐藏输入的值属性,您将看到它value="yourAssembly.Product"再次无法绑定到Product类型。

您需要为集合中每个Dog的每个属性生成一个表单控件,并为Product的每个属性生成一个表单控件。

基于以下模型的典型示例

public class Dog
{
    public int ID { get; set; }
    public string Name{ get; set; }
    public bool IsSelected { get; set; }
}
public class Product
{
    public int ID { get; set; }
    public string Name{ get; set; }
}

查看

@for(int i = 0; i < Model.MyDogs.Count; i++)
{
    @Html.HiddenFor(m => m.MyDogs[i].ID)
    @Html.CheckBoxFor(m => m.MyDogs[i].IsSelected)
    @Html.LabelFor(m => m.MyDogs[i].IsSelected, Model.MyDogs[i].Name)
}
@Html.HiddenFor(m => m.MyProduct.ID)
@Html.TextBoxFor(m => m.MyProduct.Name)

请注意,您的MyDogs需要实施IList,否则您需要使用EditorTemplate类型Dog(有关详细信息,请参阅Post an HTML Table to ADO.NET DataTable)。

另请注意,如果您未编辑Product的任何属性,则不要包含任何表单控件 - 如果需要,只需在POST方法中再次获取Product