Asp.net mvc 3 html帮助程序中的Razor视图引擎和模型

Asp.net mvc 3 html帮助程序中的Razor视图引擎和模型,asp.net-mvc-3,razor,html-helper,Asp.net Mvc 3,Razor,Html Helper,我试图从这样的模型中创建表单: 类NewContractorModel { //... 公共照片模型照片{get;set;} //... } 类摄影模型 { 公共列表f{get;set;} } 从控制器中,我对模型对象进行了一些操作(实际上我从集合中删除了一些照片),并使用以下方法将它们放入视图页面: 返回新视图(“SomeView”,模型); 我尝试为每张照片创建输入(比如隐藏输入) for(int i=0;im.photos.f[i].Uri) @Html.HiddenFor(m=>m.

我试图从这样的模型中创建表单:

类NewContractorModel
{
//...
公共照片模型照片{get;set;}
//...
}
类摄影模型
{
公共列表f{get;set;}
}
从控制器中,我对模型对象进行了一些操作(实际上我从集合中删除了一些照片),并使用以下方法将它们放入视图页面:

返回新视图(“SomeView”,模型);
我尝试为每张照片创建输入(比如隐藏输入)

for(int i=0;im.photos.f[i].Uri)
@Html.HiddenFor(m=>m.photos.f[i].ThumbnailUri)
@Html.HiddenFor(m=>m.photos.f[i].SmallThumbnailUri)
@Html.TextBoxFor(m=>m.photos.f[i].Description,新的{placeholder=“Dodaj opis”})
}
但我注意到这不起作用,因为它忽略了所有的模型修改(它仍然将所有照片存储在列表中,尽管我已经在Controller方法中删除了它们)

然后我尝试了以下代码:

for(int i=0;i
…这一次成功了

有人能解释一下这两部分代码之间的区别吗? 我已经试过十多次了,但都是一样的,所以这不是我的错 我认为HtmlHelper方法中存在一个bug,但是是否有一些变通方法?我想使用helpers方法而不是原始html

编辑: 这是一个简化的控制器类

公共类MyController
{
私有NewContractorModel _model=null;
受保护的覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
_model=SerializationUtility。反序列化(Request.Form[“Data”])为NewContractorModel;
如果(_model==null)
_模型=TempData[“数据”]作为新的承包商模型;
如果(_model==null)
_model=新的NewContractorModel()作为NewContractorModel;
TryUpdateModel(_模型);
}
ResultExecuted上受保护的覆盖无效(ResultExecutedContext筛选器上下文)
{
如果(filterContext.Result是RedirectToRouteResult)
TempData[“数据”]=\u模型;
}
私有布尔校验模型(对象模型)
{
Type Type=model.GetType();
PropertyInfo[]properties=type.GetProperties();
foreach(PropertyInfo p in properties)
{
对象[]attr=p.GetCustomAttributes(true);
foreach(属性中的对象a)
{
如果(a是ValidationAttribute)
{
对象值=p.GetValue(模型,空);
如果(!((ValidationAttribute)a).IsValid(值))
返回false;
}
}
}
返回true;
}
受保护的操作结果选择页(字符串delPhoto)
{
如果(!检查模型(_模型))
{
//采取行动
}
//.....
foreach(ZAY.Database.Photo p in_model.photos.f)
{
if(p.Uri==请求[“delPhoto”])
{
_模型。照片。f。移除(p);
打破
}
}
//.....
返回视图(“SomeView”,_模型);
}
}
我注意到,在lambdas内部,模型看起来就像TryUpdateModel调用之后(修改之前)。如果我不使用lambdas,模型将被修改…:/

还有我的Photo类(由EntityFramework生成-因此没有什么有趣的内容),并且还简化了:

公共类照片:EntityObject
{
[必需]
公共字符串Uri{get;set;}
[必需]
公共字符串ThumbnailUri{get;set;}
[必需]
公共字符串SmallThumbnailUri{get;set;}
公共字符串说明{get;set;}
}

很抱歉,我只写了这么小的代码片段,但整个代码更复杂,只有最有趣的部分。

根据您的描述,我不太理解您的第一个示例中出现了什么问题。但是循环变量
i
的范围肯定有问题

由于表达式
m=>m.photos.f[i]
涉及闭包,因此将在稍后的时间,即for循环已经完成时,对其进行计算。表达式捕获变量
i
(而不是变量
i
的值)。当它最终被计算时,它会在变量
i
中找到值
Model.photos.f.Count
。因此,所有隐藏字段和文本框将使用相同的无效值i


您的第二个代码示例通过在for循环中使用局部变量来避免此问题。

这就是我的问题的答案:


我想知道为什么文档中没有提到…:/

请发布与此问题相关的
照片
类定义和控制器的操作方法。另外,如果你能展示大部分视图(不仅仅是循环代码),这也会很有帮助。不,这不是问题,因为如果i(0,1,2,3,4,…),所有隐藏字段都有有效值。问题是当计算lambda以获取模型数据时。。。它使用了错误的模型对象:/n不是我在return View()中设置为参数的对象。似乎“m=>m…”(lambda表达式)与简单的“model…”(没有lambda)的意思不同。这很奇怪。我还尝试为Photo类创建EditorTemplate,然后调用@Html.EditorFor(m=>m.photos.f),但它仍然给出相同的结果。