C# 从视图向控制器发送数据时支持的类型

C# 从视图向控制器发送数据时支持的类型,c#,asp.net-mvc,C#,Asp.net Mvc,基本上,我想知道MVC View@HTML控件是否能够正确处理所有类型的数据 例如,我的ViewModel如下所示: public class ViewModel { public int Id { get; set; } public string Name { get; set; } public MyClass Obj { get; set; } //custom class } 在视图中,我将使用以下命令强烈键入视图: @modem <NameSpace>.ViewM

基本上,我想知道MVC View@HTML控件是否能够正确处理所有类型的数据

例如,我的ViewModel如下所示:

public class ViewModel
{
 public int Id { get; set; }
 public string Name { get; set; }
 public MyClass Obj { get; set; } //custom class
}
在视图中,我将使用以下命令强烈键入视图:

@modem <NameSpace>.ViewModel
所以看起来MVC可以正确处理某些类型,而不能处理更复杂的类型。 有人能告诉我哪些类型有效,哪些类型无效吗

或者我错过了一些明显的东西???

Html.HiddenFor对您的自定义类不起作用。您可以做的是为Model.Obj属性的不同属性创建表单元素,并将其命名为viewmodel的属性层次结构,以便在提交表单时,DefaultModelBinder能够映射表单字段的viewmodel对象属性

@model ViewModel
@using (Html.BeginForm())
{
    @Html.Hidden("Id", Model.Id)

    @Html.Hidden("Obj.Id", Model.Obj.Id)
    @Html.Hidden("Obj.Name", Model.Obj.Name)

    @Html.TextBox("Nom", null)
    <input type="submit" value="Submit" />
    <input type="submit" />
}
另一种解决方案是使用编辑器模板,并调用类似Html.EditorForModel.Obk的模板,如中所述


此外,除非绝对需要,否则不应设置表单中的所有属性值。相反,在HttpPost操作中,您应该使用唯一标识符(表的主键)再次查询实体,您将其作为隐藏字段保存在表单中,不在数据库中或其他地方,并根据需要使用。

只要您为它们创建自定义模型绑定,所有类型都可以工作。您是否询问默认模型绑定行为?HTML输入只能保存基元值。因此,任何复杂对象都需要在多个输入上拆分为多个原语值,或者在单个输入上序列化为字符串。控制器如何将值重新组合到对象中是模型绑定的问题。您可以使用默认的模型活页夹,也可以编写任意数量的自定义活页夹。
public ActionResult MyAction(ViewModel viewModel)
@model ViewModel
@using (Html.BeginForm())
{
    @Html.Hidden("Id", Model.Id)

    @Html.Hidden("Obj.Id", Model.Obj.Id)
    @Html.Hidden("Obj.Name", Model.Obj.Name)

    @Html.TextBox("Nom", null)
    <input type="submit" value="Submit" />
    <input type="submit" />
}
[HttpPost]
public ActionResult Index(ViewModel model)
{
    // to do  : Do something and return something
}