基本上,我想知道MVC View @HTML控件是否可以正确处理所有类型的数据。
例如我的ViewModel如下:
public class ViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public MyClass Obj { get; set; } //custom class
}
在视图中,我将强烈键入View with:
@modem <NameSpace>.ViewModel
理想情况下,我希望View允许用户填写名称并保留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可以正确处理某些类型而不能更复杂的类型。 有人能让我知道哪些类型有效并且不起作用?
还是我错过了一些明显的东西?
答案 0 :(得分:4)
Model.Obj
无法为您的自定义课程工作。您可以做的是为@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" />
}
属性的不同属性创建表单元素,并将其命名为viewmodel的属性层次结构,这样当您提交表单时,DefaultModelBinder将能够映射表单字段&# 39;是您的ViewModel对象属性。
Name
假设Id
和[HttpPost]
public ActionResult Index(ViewModel model)
{
// to do : Do something and return something
}
是MyClass的属性。
你的HttpPost动作看起来像
Html.EditorFor(Model.Obk)
另一种解决方案是使用编辑器模板,并按照this post中的说明调用$('table')
。
此外,除非绝对需要,否则不应在表单中设置所有属性值。相反,在HttpPost操作中,你应该再次使用一个唯一的标识符(你的表的一个主键?,你在表单中保存为隐藏的fiel d)从你的数据库或某个地方再次查询实体并根据需要使用它。