Asp.net mvc 4 MVC 4型号未返回控制器
我有三个使用Ajax在视图中填充自己的级联下拉列表。同样在视图中,我调用了一个局部视图,该视图迭代模型中的一个容器,并为每个项调用另一个局部视图,以根据下拉列表中的选定项编辑适当的模型属性。我构建了一个复杂的模型,其中包含下拉选项和要编辑的属性,并将模型的部分传递给显示要编辑的属性所需的最低级别部分 我希望在用户单击submit按钮时,通过一个普通的Html.BeginForm而不是使用Ajax来更新db。因此,我必须只包装在表单中显示属性的部分,以便现有Ajax功能不会发布到控制器。问题是,尽管我可以构建这一切,并且提交按钮按预期连接到控制器,但模型返回到控制器null 模型不是通过构建它们的路径从部分返回吗?或者更准确地说,即使模型是使用partials构建的,它也不会在页面上持久存在吗 我肯定有人会建议我使用Ajax发帖,但这对我来说不是一个最佳选择。或者有人可能会问页面上的html是什么样子的。奇怪的是,我只能使用浏览器开发工具查看完整的html,它不会显示在视图源选择中 有什么想法吗 将此移动到它所属的位置:Asp.net mvc 4 MVC 4型号未返回控制器,asp.net-mvc-4,Asp.net Mvc 4,我有三个使用Ajax在视图中填充自己的级联下拉列表。同样在视图中,我调用了一个局部视图,该视图迭代模型中的一个容器,并为每个项调用另一个局部视图,以根据下拉列表中的选定项编辑适当的模型属性。我构建了一个复杂的模型,其中包含下拉选项和要编辑的属性,并将模型的部分传递给显示要编辑的属性所需的最低级别部分 我希望在用户单击submit按钮时,通过一个普通的Html.BeginForm而不是使用Ajax来更新db。因此,我必须只包装在表单中显示属性的部分,以便现有Ajax功能不会发布到控制器。问题是,尽
我不确定我是否理解。我知道返回的模型需要与期望的模型匹配,但我没有得到上面的解释。你说“如果你的控制器看起来像这样:”,当然它是这样的,然后呢?错了吗? 我必须在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请求中发送实际键/值对的问题。这些需要映射到模型类的物理(而不是概念)结构。没有一个例子可以分享,你是唯一能证实情况是否属实的人。我不确定我是否理解。我知道返回的模型需要与期望的模型匹配,但我没有得到上面的解释。你说“如果你是我的话