将数据从视图发送到控制器时支持的类型

本文关键字:控制器 支持 类型 数据 视图 | 更新日期: 2023-09-27 18:32:04

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

例如,我的视图模型如下:

public class ViewModel
{
 public int Id { get; set; }
 public string Name { get; set; }
 public MyClass Obj { get; set; } //custom class
}

在视图中,我将强键入视图:

@modem <NameSpace>.ViewModel

理想情况下,我希望视图让用户填写名称并保留 Id 和 Obj 的记录

我最终会得到一个看起来像这样的表单:

@using (Html.BeginForm("MyAction", "MyController"))
{
    @Html.Hidden("Id", Model.Id) // --> this will work
 @Html.Hidden("Obj", Model.Obj)// --> this will NOT work
@Html.TextBox("Nom", null)// --> this will work
<input type="submit" value="Submit" />
}

Id 和 Name 将正确提交,但我会在我的控制器中获取 viewModel.Obj = null:

public ActionResult MyAction(ViewModel viewModel)

因此,看起来MVC可以正确处理某些类型,而不能处理更复杂的类型。有人可以让我知道哪些类型有效,哪些类型无效?

还是我错过了一些明显的东西??

将数据从视图发送到控制器时支持的类型

Html.HiddenFor不适用于您的自定义类。您可以做的是为Model.Obj属性的不同属性创建表单元素,并将其命名为与视图模型的属性层次结构相同,以便在提交表单时,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" />
}

假设NameId是 MyClass 的属性。

您的 HttpPost 操作看起来像

[HttpPost]
public ActionResult Index(ViewModel model)
{
    // to do  : Do something and return something
}

另一种解决方案是使用编辑器模板并像Html.EditorFor(Model.Obk)一样调用它,如本文中所述。

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