do a HTTPPOST MVC2
本文关键字:MVC2 HTTPPOST do | 更新日期: 2023-09-27 17:49:27
我有一个mvc2应用程序。在这个应用程序中,我有一个强类型视图,它与模型newwhorsemmodel相竞争:
public class NewHorseModel
{
public List<Category> Faehigkeit { get; set; }
}
public class Choice
{
public int Id { get; set; }
public string Name { get; set; }
public string Beschreibung { get; set; }
public bool Selected { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public string Beschreibung { get; set; }
public List<Category> Subcategories { get; set; }
public List<Choice> Choices { get; set; }
public int Parent { get; set; }
}
视图如下所示:
<p>
<input faehigkeit_ID="1" id="Selected" name="Selected" type="checkbox" value="true" />
<input name="Selected" type="hidden" value="false" />
Mitteltrab
<input id="Id" name="Id" type="hidden" value="1" />
</p>
<p>
<input faehigkeit_ID="2" id="Selected" name="Selected" type="checkbox" value="true" />
<input name="Selected" type="hidden" value="false" />
Arbeitstrab
<input id="Id" name="Id" type="hidden" value="2" />
</p>
<p>
<input faehigkeit_ID="3" id="Selected" name="Selected" type="checkbox" value="true" />
<input name="Selected" type="hidden" value="false" />
Trab versammelt
<input id="Id" name="Id" type="hidden" value="3" />
</p>
<p>
<input faehigkeit_ID="11" id="Selected" name="Selected" type="checkbox" value="true" />
<input name="Selected" type="hidden" value="false" />
Trab
<input id="Id" name="Id" type="hidden" value="11" />
</p>
这个视图是这样创建的:类别和子类别MVC2
现在我想做一个帖子,但如何获得数据?当我写这样的帖子时:
[HttpPost]
public void myAction(NewHorseModel newHorseModel)
{
// ...
}
newhorsemmodel中的faehighkeit为null
我的ASPX Code:
<div id="Div2">
<%
foreach (Category item2 in Model.Faehigkeit)
{
Html.RenderPartial("Faehigkeit", item2);
}
%>
</div>
部分视图类别(强类型模型类别):
<%
if (Model.Choices != null)
{
foreach (var item in Model.Choices)
{
Html.RenderPartial("Choice", item);
}
}
if (Model.Subcategories != null)
{
foreach (var item in Model.Subcategories)
{
Html.RenderPartial("Faehigkeit", item);
}
}
%>
和partialview Choices(强类型模型选择)
<p>
<%: Html.CheckBoxFor(m => m.Selected, new { faehigkeit_ID = Model.Id }) %>
<%: Model.Name %>
<%: Html.HiddenFor(u=>u.Id) %>
</p>
下一个测试:在Faehigkeit。我已经添加了以下代码:
<input type="hidden" name="Faehigkeit[<%=Model.Id%>].Id" value="<%=Model.Id%>" />
<input type="hidden" name="Faehigkeit[<%=Model.Id%>].Name" value="<%: Model.Name%>" />
中的选项。我已经添加了以下代码:
<input type="checkbox" name="Faehigkeit[0].Choices[<%=Model.Id%>].Selected" />
我不需要知道哪个选项属于哪个类别。我只需要知道哪个选项ID被选中了,哪个没有。
html输出如下:
<input type="hidden" name="Faehigkeit[1].Id" value="1" />
<input type="hidden" name="Faehigkeit[1].Name" value="Qualität der Gangarten" />
<input type="hidden" name="Faehigkeit[1].Choices[4].Id" value="4" />
<input type="checkbox" name="Faehigkeit[1].Choices[4].Selected" />
我的控制器看起来像这样:(HttpPost)
public ActionResult CreateNewHorse(NewHorseModel collection)
{
if (User.Identity.IsAuthenticated)
{
return View();
}
else
{
return View("Account/LogOn");
}
}
如果我试图获得"Faehigkeit"的值->"Choices"每件事都是Null("Faehigkeit"的名称,"Faehigkeit"的ID,没有选择在调试期间显示newhorsemmodel内容的图像:https://i.stack.imgur.com/6yLZW.png
非常感谢!
我写了两篇博文来解决你的问题:
-
如何将
IList<T>
发布到控制器动作在这里解释,并将指导您从头到尾,以便您了解它实际上是如何工作的以及为什么。 -
由于您可能在客户端有复杂的JSON对象,并希望它们在您的操作方法中在服务器上绑定模型(就像在您的情况下一样),这篇文章可能也是一个有趣的阅读。它解释了发送复杂JSON对象的问题,并提供了一个简单的jQuery插件,可以将客户端对象转换成一个表单,这样就可以很容易地将数据绑定到你的强类型操作方法参数上。
注意:也可以使用Phil Haack解释的
JsonValueProviderFactory
,但该解决方案需要在客户端和服务器端进行更改(因为您使用的是MVC2)。
基于你的代码
您只提供了部分代码(其中一些并不真正相关,但无论如何),我将对您的情况进行观察。
您希望在服务器上建模绑定的所有输入字段都需要具有正确的名称。从渲染的复选框名称中,我们可以看到根本不是这样的。
根据你的模型,你的输入应该被命名为(别管输入类型,因为只有你知道哪些应该呈现,哪种类型):
<!-- erste fähigkeit -->
<input name="Faehigkeit[0].Id" />
<input name="Faehigkeit[0].Name" />
<input name="Faehigkeit[0].Beschreibung" />
<input name="Faehigkeit[0].Subcategories[0].Id" />
<input name="Faehigkeit[0].Subcategories[0].Name" />
...
<input name="Faehigkeit[0].Choices[0].Id" />
<input name="Faehigkeit[0].Choices[0].Name" />
<input name="Faehigkeit[0].Choices[0].Beschreibung" />
<input name="Faehigkeit[0].Choices[0].Selected" />
...
<input name="Faehigkeit[0].Choices[x].Id" /> <!-- "x" could be any number -->
...
<input name="Faehigkeit[0].Parent" />
<!-- zwite fähigkeit -->
<input name="Faehigkeit[1].Id" />
...
<!-- usw. -->
基于这个复杂的层次模型,这个表单可以是巨大的。你可能不希望发送所有属性因为你只需要一些相关的。但最主要的是输入命名应该按照描述。
非常重要的:我应该指出索引(即;
Faehigkeit[0]
)不应该与id相关,而是数组/列表项索引。它们应该是连续的,所以应该总是从0开始,并且应该增加1到最后一个N,因此应该没有任何间隔。相信我,我在写博客的时候已经测试过了。否则,服务器上的模型绑定将失败。确保你通过了这个要求!根据你编辑的问题,情况并非如此,因为你输入的是id而不是索引。
如果您将数据作为JSON传输到客户端,您将在客户端上有一个对象:
var data = {
Faehigkeit: [
{
Id: 1,
Name: "Some name",
Beschreibung: "Some description",
Subcategories: [
{ ... },
{ ... },
...
],
Choices: [
{ ... },
{ ... },
...
]
},
{ ... },
...
]
};
如果你的客户端视图直接操作这个对象,然后你可以把它发送回服务器通过jQuery Ajax调用ie:
$.ajax({
type: "POST",
url: "someController/myAction",
data: $.toDictionary(data), // this is my jQuery plugin mentioned earlier
success: function() { ... },
error: function() { ... }
});
所以选择是你的,但在任何情况下,字段名都应该是正确的,否则你的模型将无法绑定到你的参数,你将无法使用它。
您可以尝试使用<%= Html.EditorFor(m => m); %>
,但这可能不是您想使用的那种形式。在这种情况下,必须使用手动输入命名。或者您也可以编写一些自定义代码。
Tuple<string, Category>
。字符串将告诉它string
应该在您的字段名之前。
Html.RenderPartial("Faehigkeit", Tuple.New("Faehigkeit[0]", item2));
然后,当你继续,以前的数据应该总是添加,这样你的子类别的列表和他们尊重的子主题将有正确的输入表单名称。
不太好,但我想这是唯一的办法。
通常如果你把HttpPost作为你的动作的一个属性,它是这样的:
[HttpPost]
public void myAction(NewHorseModel newHorseModel)
{;}
然后把类类型作为你的参数它应该为你自动绑定它,如果有任何疯狂的,你需要做的,或者是从外部非ASP页面张贴到这个动作,你可以使用FormCollection(我认为)作为你的参数,这是一个美化的字典包含所有的元素和值。