Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MVC2中的ViewModel子对象为空?_C#_.net_Asp.net Mvc 2_Viewmodel - Fatal编程技术网

C# 为什么MVC2中的ViewModel子对象为空?

C# 为什么MVC2中的ViewModel子对象为空?,c#,.net,asp.net-mvc-2,viewmodel,C#,.net,Asp.net Mvc 2,Viewmodel,我有一个web应用程序,我想在其中显示一个测试对象的表单。不同的测试实例可以有不同的模式。我可以很好地显示它,但它不会将表单中的所有数据填充回我的模型中 以下是我的模型课程: public class EnterTestData { public string StudyId { get; set; } public Test Test { get; set; } } public sealed class Test { public string Identity {

我有一个web应用程序,我想在其中显示一个测试对象的表单。不同的测试实例可以有不同的模式。我可以很好地显示它,但它不会将表单中的所有数据填充回我的模型中

以下是我的模型课程:

public class EnterTestData
{
    public string StudyId { get; set; }
    public Test Test { get; set; }
}

public sealed class Test
{
    public string Identity { get; set; }
    public string Name { get; set; }
    public IEnumerable<TestField> Fields { get; set; }
}

public sealed class TestField
{
    public string Identity { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public string Type { get; set; }
}

问题是
Test
返回控制器时为空。我如何让它被填充?为什么为空?

我认为问题在于Html.TextBox元素。 如果视图中的模型类型为“Test”是正确的,但在控制器操作中,您希望绑定到“EnterTestData”类型,该类型具有名为“Test”的“Test”类型属性 然后你的文本框应该初始化为

Html.TextBox("Test.Name", Model.Value)
重要的部分是name参数。modelbinder将此名称与post操作中的模型类型属性(在您的案例“EnterTestData”中)相匹配

也可以使用编辑器模板视图。这与局部视图的作用相同。 在您的项目中,转到Views\Shared\并创建一个名为EditorTemplates的文件夹(如果不存在)。 在此文件夹中创建局部视图,并将其命名为模板应用于的类/类型。在您的例子中是“TestField.ascx”。实际上,您可以复制和重命名现有的局部视图。 在主视图中,您必须更改两件事: -使用for代替foreach -在循环中调用编辑器模板 比如:

我经常使用这种模式。它使绑定复杂模型变得容易。
您可以查看生成的HTML

是否也可以显示控制器操作方法?完成。此外,我意识到我在部分视图中的文本框定义不好,因此我也对其进行了更新。作为一种最佳实践,您总是尝试为您的actions方法提供[HttpGet]或[HttpPost]。很难理解哪一个是get和post?您能同时提供EF数据访问代码吗?索引操作方法?我没有任何EF代码,我没有使用EF。这也不相关。谢谢@developer10214。我最终通过编写一个定制的IModelBinder解决了这个问题,并准备发布这个答案。但由于这更直截了当地解决了我提出的问题,我将在明天测试它,看看它是否有效。
<tr>
    <td>
        <%= Model.Name %>
    </td>
    <td>
        <%
            switch (Model.Type)
            {
                case "date":
                case "text":
                case "number":
        %>
        <%=  Html.TextBox(Model.name, Model.Value) %>
        <%  break;
                default: %><%= Html.Label("Unknown data type") %><% break;
            }
        %>
    </td>
</tr>
    public ActionResult EnterTestData(string studyId, string testId)
    {
        var testDefinition = ServiceKitLocator.GetStudyService().GetTestDefinition(testId);

        return View(new EnterTestData { StudyId = studyId, Test = testDefinition });
    }

    public ActionResult PostTestData(EnterTestData model)
    {
        //I'm just putting a break point here and checking the model in the debugger for now
        return RedirectToAction("Index");
    }
Html.TextBox("Test.Name", Model.Value)
for(int i = 0; i < Model.Test.Fields.Count(); i++)
            Html.EditorFor(Model => Model.Test.Fields[i]);
Html.TextBoxFor(Model => Model.Value)