当intellisense弹出时,我正在使用以下模型为我的一个View构建一个Html帮助器,我不知道你能做什么。基本上我的模型如下
public class Mainclass
{
public List<main> mainset { get; set; }
// do sth to load and save model info
}
public class main
{
public personalinfo info { get; set; }
public addressinfo currentaddr { get; set; }
public addressinfo[] otheraddr { get; set; }
public telephone currenttel { get; set; }
public telephone[] othertel { get; set; }
}
public class personalinfo
{
public string Name { get; set; }
public string Surname { get; set; }
public string Ni { get; set; }
public string dob { get; set; }
public employer currentemployer { get; set; } //another class employer
public employer[] otheremployer { get; set; } //an array of employer class
}
intellisense弹出的是(model =&gt; m.info.Name)。
@if ( Model.mainset != null){
foreach ( var m in Model.subset )
{
<div class="editor-label">
@Html.LabelFor(model => m.info.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => m.info.Name)
@Html.ValidationMessageFor(model => m.info.Name)
<div class="editor-label">
}
所以我想知道这个陈述是如何起作用的?它是否允许我在没有帮助器或ajax或json的情况下直接在主模型中设置子域?
答案 0 :(得分:2)
这是一个lambda,并不像它看起来那么神奇(无论如何从高层开始)。
最好从源头学习:Lambda Expressions - MSDN C# Programming Guide
基本上,在MVC中,使用lambda的方法会在发布表单时将该属性绑定到模型中。
答案 1 :(得分:1)
Lambda只是一个运营商。关键是ValidationMessageFor()
或EditorFor()
函数。他们期望Func<T>
参数是一个委托。使用lambda,您可以传递参数,该参数是委托签名中的模型,在lambda运算符之后,您将编写方法的实现。因此,如果扩展模型,您将在intellisense中看到新成员。
注意: 必须在使用之前实例化委托,但MVC框架在您创建强类型视图时动态处理它。 Location of HtmlHelper instantiation for ASP.NET MVC
答案 2 :(得分:1)
为了澄清一下,你不是一般都会问一下lambda的问题,而是问UNUSED
吗?
foreach (var item in Model.Items)
{
@Html.DisplayFor(UNUSED => item.Foo)
}
它有效,因为你确实传递了item.Foo
的值。 MVC帮助程序不能再将它绑定到模型的属性,因此您可以使用此表示法进行显示,但不能直接用于编辑控件。