Asp.net mvc 4 MVC 4型号未返回控制器

Asp.net mvc 4 MVC 4型号未返回控制器,asp.net-mvc-4,Asp.net Mvc 4,我有三个使用Ajax在视图中填充自己的级联下拉列表。同样在视图中,我调用了一个局部视图,该视图迭代模型中的一个容器,并为每个项调用另一个局部视图,以根据下拉列表中的选定项编辑适当的模型属性。我构建了一个复杂的模型,其中包含下拉选项和要编辑的属性,并将模型的部分传递给显示要编辑的属性所需的最低级别部分 我希望在用户单击submit按钮时,通过一个普通的Html.BeginForm而不是使用Ajax来更新db。因此,我必须只包装在表单中显示属性的部分,以便现有Ajax功能不会发布到控制器。问题是,尽

我有三个使用Ajax在视图中填充自己的级联下拉列表。同样在视图中,我调用了一个局部视图,该视图迭代模型中的一个容器,并为每个项调用另一个局部视图,以根据下拉列表中的选定项编辑适当的模型属性。我构建了一个复杂的模型,其中包含下拉选项和要编辑的属性,并将模型的部分传递给显示要编辑的属性所需的最低级别部分

我希望在用户单击submit按钮时,通过一个普通的Html.BeginForm而不是使用Ajax来更新db。因此,我必须只包装在表单中显示属性的部分,以便现有Ajax功能不会发布到控制器。问题是,尽管我可以构建这一切,并且提交按钮按预期连接到控制器,但模型返回到控制器null

模型不是通过构建它们的路径从部分返回吗?或者更准确地说,即使模型是使用partials构建的,它也不会在页面上持久存在吗

我肯定有人会建议我使用Ajax发帖,但这对我来说不是一个最佳选择。或者有人可能会问页面上的html是什么样子的。奇怪的是,我只能使用浏览器开发工具查看完整的html,它不会显示在视图源选择中

有什么想法吗

将此移动到它所属的位置:

我不确定我是否理解。我知道返回的模型需要与期望的模型匹配,但我没有得到上面的解释。你说“如果你的控制器看起来像这样:”,当然它是这样的,然后呢?错了吗? 我必须在Chrome的开发工具中查看实际的html输出,我在一个例子中看到了这一点:


因此,如果“name”标签需要看起来合适,我认为它是合适的。我错了吗?

我的日期字段如下所示:


因此没有“name”标记,但有id。是否需要添加名称?

下面是生成上述内容的代码:
@foreach(模型中的状态){

string date=status.date.HasValue?status.date.Value.toSortDateString():string.Empty;


@Html.DisplayFor(model=>status.Name)

@Html.DisplayDropdownColorFor(model=>status.StatusValue)



@Html.EditorFor(model=>status.Comments)

}`
天啊,我听起来像个绝望的白痴。
谢谢你的帮助。

假设你上过几堂这样的课:

public class SomeClass1 
{
    public string Name { get; set; }
    public SomeClass2 class2Value { get; set; }
}

public class SomeClass2
{
    public string Description { get; set; }
}
<form id="form1" action="/pageurl" method="POST">
    <fieldset>
        <div class="editor-label">
            Name
        </div>
        <div class="editor-field">
            <input type="text" name="Name" id="Name" value="Name val 1" />
        </div>

        <div class="editor-label">
            Description
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.class2Value.Description)
            <input type="text" name="class2Value.Description" id="class2Value_Description" value="Desc val 2" />
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
</form>
[HttpPost]
protected ActionResult Save(SomeClass1 model)
{
    //Then 
    // SomeClass1.Name == "Name val 1"
    // and 
    // SomeClass1.class2Value.Description == "Desc val 2"
}
在Razor视图中有一个表单:

@model SomeClass1

@using (Html.BeginForm()) {
    <fieldset>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.class2Value.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.class2Value.Description)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
这就是@David在评论中的意思。。。无论页面多么复杂,当
发回服务器时,返回的字段的
名称
属性必须与控制器操作所期望的模型一致。。。或者您将获得
null

您甚至可以为post模型创建自定义类,只要
名称
属性与模型对齐,即使它与Razor视图顶部的
@model
不同,MVC将使用键/值对并填充post模型中的数据

更新

我更新了上述内容以反映更正。下划线是ID属性中的分隔符,句点用于NAME属性

@leemid:HTML
表单
只发布带有
名称
属性的字段。提交
表单
时,只有
名称
的输入、选择、文本区域等才会传回服务器。这些名称必须与控制器期望的模型内联。为了听起来多余,示例中显示的日期
input
字段没有
name
attibute,如果
name
id
相同,则模型中必须有一个属性,如

公共字符串dp1391795955619{get;set;}

使其显示在控制器的操作中。您可以手动设置
名称
,只要它按照MVC期望的方式命名,以便发布时可以将其传递到模型中


在我的示例中,我试图强调的部分是类和属性名称之间的关系,与MVC写入HTML文档的名称属性之间的关系,以及它如何保持所有这些内容的完整性。在简单的例子中,您不必考虑它。但在您复杂的场景中,似乎您必须手动管理一些命名约定,以便MVC能够理解您正在尝试做什么。

这是大量的描述和。。。没有密码。你能提供一个关于这个问题的工作实例吗?模型绑定并不是一个真正的黑盒。您发布的表单中有哪些表单元素?哪些键/值对被发布到服务器?他们是你所期望的吗?它们是否符合您期望的模型结构?我希望避免发布代码,这相当复杂。表单元素都是文本框,没有比字符串和日期更复杂的了。该模型是基于上一个选项的每个下拉列表的选项列表,最后一个选项会触发一个db查询,用字符串填充模型的其余部分。我认为您没有抓住要点。从概念上讲,这不是形式代表什么的问题。这是一个在POST请求中发送实际键/值对的问题。这些需要映射到模型类的物理(而不是概念)结构。没有一个例子可以分享,你是唯一能证实情况是否属实的人。我不确定我是否理解。我知道返回的模型需要与期望的模型匹配,但我没有得到上面的解释。你说“如果你是我的话