C# 循环似乎每次都产生相同的值
我有一个名为Groups的字符串数组,包含以下两个字符串C# 循环似乎每次都产生相同的值,c#,asp.net-mvc,asp.net-mvc-3,model-view-controller,C#,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,我有一个名为Groups的字符串数组,包含以下两个字符串 阿尔法族 B组 控制器 public ActionResult Task(TaskModel model) { return PartialView(model); } 调用我的任务操作的索引视图 <div id="update"> @using (Ajax.BeginForm("Task", "Home", new AjaxOptions { UpdateTargetId = "update", Ins
public ActionResult Task(TaskModel model)
{
return PartialView(model);
}
调用我的任务操作的索引视图
<div id="update">
@using (Ajax.BeginForm("Task", "Home", new AjaxOptions { UpdateTargetId = "update", InsertionMode = InsertionMode.Replace}))
{
<input value="Group Alpha" name="Groups"/>
<input value="Group Bravo" name="Groups"/>
<button type="submit">Submit</button>
}
</div>
@使用(Ajax.BeginForm(“任务”、“主页”、新的AjaxOptions{UpdateTargetId=“update”,InsertionMode=InsertionMode.Replace}))
{
提交
}
我的任务视图
@模型MVCAPApplication4.Models.TaskModel
<div id="container">
@if (Model.Groups != null)
{
foreach (var group in Model.Groups)
{
@Html.TextBox("Groups", group, new { @id = String.Empty })
}
}
</div>
@如果(Model.Groups!=null)
{
foreach(Model.Groups中的var组)
{
@TextBox(“Groups”,group,new{@id=String.Empty})
}
}
我的任务模型
公共类TaskModel:IValidatableObject
{
公共Guid TaskId{get;set;}
公共字符串名称{get;set;}
公共字符串[]组{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
屈服断裂;
}
}
这仅输出组Alpha组Alpha。问题在哪里
对不起,我之前不清楚
复制问题的示例项目我认为这是一个关闭问题。请尝试以下代码:
<div id="container">
@if (Model.Groups != null)
{
foreach (var group in Model.Groups)
{
var currentGroup = group;
@Html.TextBox("Groups", currentGroup, new {@id = String.Empty});
}
}
</div>
@如果(Model.Groups!=null)
{
foreach(Model.Groups中的var组)
{
var currentGroup=组;
@TextBox(“Groups”,currentGroup,new{@id=String.Empty});
}
}
您发布了一些名为组的输入字段。在处理该帖子的操作方法中,您呈现一个使用@Html.TextBox(“Groups”,…)
的分部
@Html.TextBox
使用ModelState根据输入元素名称,用先前发布的值填充值。在这种情况下,它采用在POST中找到的第一个Groups
值,即“groupalpha”
在渲染局部视图之前,请清除ModelState(或仅清除Groups键)
这:
工作
下次试着提前显示所有相关的代码,这样我们就不需要太多的注释了。:-) 你认为你是第一个在foreach
循环中使用@Html.TextBox
的人吗?这是不太可能的,所以更可能的错误是在您的代码。你确定你调用的重载正确吗?您能展示一下如何填写Model.Groups
?你能打印@Html.Raw(group)
?很有可能你正在使用的IEnumerable
被编写成在迭代时会改变结果,一个常见的例子是在循环变量C#5.0之前关闭,尽管肯定还有其他方法可以制造像这样的真正邪恶的迭代器。@JoachimIsaksson关闭循环变量的问题不会出现在显示的代码中;它将在组的实现中
。这里的代码将评估循环体中的任何lambda。你可以说你看到它工作了,但我不相信,因为对我来说,它工作得像预期的那样。请更新您的问题,以显示实际将此模型返回到视图的代码。试试像我这样的硬编码模型。我们真的无法按原样处理您的问题。@heymega鉴于问题显然与您所展示的代码无关,请向我们展示我们要求查看的代码,而不仅仅是告诉我们“它是正确的”。显然不是,或者其他地方不对劲。不过,显示的代码不会复制您的问题。他没有关闭显示代码中的变量,即使他关闭了,也不会产生指定的问题(不可能导致第一个项目打印两次;最多可能导致最后一个项目打印两次)。问题出在其他地方的代码中。@Servy-你能解释一下他是如何不关闭变量的吗?你能解释一下他是如何关闭变量的吗?因为没有匿名方法,这是在C#中创建闭包的唯一方法。我假设它在@Html.TextBox
方法中,因为它在他的代码中不可见。那个,或者剃刀。我不完全确定,这就是为什么我说我想而不是我知道。我只是想帮点忙。啊,实际上我在另一个动作中有这样的动作:(谢谢你的帮助,但我已经尽了最大的努力。它的公司代码,所以我必须首先重构它:(@CodeCasterv-这不是一个缺陷吗?为什么它要基于输入元素名?拥有多个同名元素是完全合法的,这是有效的。)(您可以从代码中完全读取值),但这不是PHP,也不是处理同一属性的值列表的方式。请参阅如何使用MVC实现相同的行为。我完全了解您的来历,但如果是这样的话,defaultmodelbinder不应基于此处提到的相同名称绑定集合-感谢您的帮助,尽管这很有压力把我弄出来:)
<div id="container">
@if (Model.Groups != null)
{
foreach (var group in Model.Groups)
{
var currentGroup = group;
@Html.TextBox("Groups", currentGroup, new {@id = String.Empty});
}
}
</div>
ModelState.Clear();
ModelState.Remove("Groups");
return PartialView(model);