【问题标题】:Pass complex object from view to Controller将复杂对象从视图传递到控制器
【发布时间】:2017-07-23 12:49:01
【问题描述】:

我有这个模型:

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>

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

【问题讨论】:

  • 您可能希望将IEnumerable&lt;Dog&gt; MyDogs 转换为IList&lt;SelectListItem&gt; MyDogs,例如this
  • MyProduct 已绑定,但 myDogs 未绑定?
  • 两者都没有被绑定,但此时我想我找到了myDogs的解决方案,但是MyProduct暂时没有被绑定......

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


【解决方案1】:

您不能将复杂对象绑定到&lt;input&gt;。两者都回发一个值。

如果选中,则您的复选框发回"on",如果没有(因为它没有value 属性),则无法绑定到typeof Dog。如果您检查隐藏输入的 value 属性,您将看到它是 value="yourAssembly.Product",它再次无法绑定到 typeof 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 for typeof Dog(有关详细信息,请参阅Post an HTML Table to ADO.NET DataTable)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多