从View向Controller

时间:2016-01-26 21:43:26

标签: 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
}

在视图中,我将强烈键入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可以正确处理某些类型而不能更复杂的类型。 有人能让我知道哪些类型有效并且不起作用?

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

1 个答案:

答案 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)从你的数据库或某个地方再次查询实体并根据需要使用它。