将数据从视图发送到控制器时支持的类型
本文关键字:控制器 支持 类型 数据 视图 | 更新日期: 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" />
}
假设Name
和Id
是 MyClass 的属性。
您的 HttpPost 操作看起来像
[HttpPost]
public ActionResult Index(ViewModel model)
{
// to do : Do something and return something
}
另一种解决方案是使用编辑器模板并像Html.EditorFor(Model.Obk)
一样调用它,如本文中所述。
此外,除非绝对需要,否则不应在窗体中设置所有属性值。相反,在 HttpPost 操作中,您应该使用唯一标识符(表的主键?,您将其作为隐藏的 fiel d 保存在表单中)从数据库或某个地方再次查询实体,并根据需要使用它。