Asp.net mvc 3 ASP.NET MVC强类型HTML帮助程序

Asp.net mvc 3 ASP.NET MVC强类型HTML帮助程序,asp.net-mvc-3,lambda,strongly-typed-view,Asp.net Mvc 3,Lambda,Strongly Typed View,让我们看这行:@Html.LabelFor(m=>m.UserName) 在页面上有以下行:@model CurrencyMvc.Models.RegisterModel 我假设当页面视图呈现LabelFor时,会自动调用对所述模型的引用,并且Lambda函数会告诉它如何从模型中获取所需的信息 我不清楚为什么我们要传递一个函数,而我们可以传递实际值,例如m.Username 哦,当这个助手被调用时,“m”来自哪里?有两个类用于razor页面(第二个类来自第一个类): System.Web.Mvc

让我们看这行:
@Html.LabelFor(m=>m.UserName)
在页面上有以下行:
@model CurrencyMvc.Models.RegisterModel

我假设当页面视图呈现LabelFor时,会自动调用对所述模型的引用,并且Lambda函数会告诉它如何从模型中获取所需的信息

我不清楚为什么我们要传递一个函数,而我们可以传递实际值,例如m.Username


哦,当这个助手被调用时,“m”来自哪里?

有两个类用于razor页面(第二个类来自第一个类):

  • System.Web.Mvc.WebViewPage
  • System.Web.Mvc.WebViewPage
  • 因此,当您通过指定模型来使用强类型视图时,您的视图派生自泛型版本,
    Html
    属性是泛型的
    HtmlHelper
    。因为总是使用强类型视图是一种很好的实践,所以我不再谈论第一个类,因为它不感兴趣

    让我们看看
    LabelFor
    扩展方法的签名:

    public static MvcHtmlString LabelFor<TModel, TValue>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TValue>> expression
    )
    {
        ...
    }
    
    publicstaticmvchtmlstringlabelfor(
    这个HtmlHelper html,
    表情
    )
    {
    ...
    }
    
    从这个定义中可以看出,
    LabelFor
    方法是
    HtmlHelper
    类的扩展方法,该类接受1个参数。此方法仅在具有强类型视图时可用。参数表示一个lambda表达式,该表达式仅限于一个成员访问表达式(如果您尝试使用一些奇特的东西,助手将抛出一个异常)。它将模型作为参数,并且必须返回此模型的属性

    借助此信息,帮助器能够确定要指定的成员的名称,从而生成正确的标记。由于参数是一个lambda表达式,因此它还能够确定此属性的元数据(您可能已使用诸如
    [DisplayName]
    ,…允许您指定其他元数据之类的属性来修饰视图模型属性)。如果帮助程序按照您的要求只获取一个值:
    Html.LabelFor(Model.SomeValue)
    您知道在这个
    LabelFor
    方法中,您将获得的只是这个值。您将永远无法访问视图模型的元数据,这是ASP.NET MVC中的一个基本概念

    我假设当页面视图呈现LabelFor时 自动引用所描述的模型,并且 Lambda函数告诉它如何从模型中获取所需的信息

    我不完全确定我对这部分的理解,我猜你的意思是
    @LabelFor
    如何知道使用哪种型号

    好吧,是的,如果你看下面的例子:

    public static MvcHtmlString LabelFor<TModel, TValue>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TValue>> expression
    )
    
    如您所见,它实际上需要
    m.Username
    变量名

    哦,当这个助手被称为“m”时,它来自哪里


    这只是一个变量。就像
    foreach(数据集中的var m){}
    “m从哪里来?”——这是你编的。你可以用任何东西替换m,我知道这已经有一段时间了,但我认为下面的链接对那些仍在寻找好的解释的人来说会很有帮助。

    好吧,我想这对我来说已经开始有意义了。。。这是漫长的一天,有很多新信息。因此,为了澄清,我在这里解释了简单性,我可以将LabelFor方法视为在RealStestMod类中称为方法(扩展)。然后在LabelFor方法中,它使用/调用“expression”来获取所需的值,并且(这里是big和)还解构“expression”,以确定该值与类中的哪些属性关联?因此,我应该考虑哪些属性,验证等等,我走对了吗?嗯。。是的,除了我的RegisterModel上的“(扩展)之外”
    此HtmlHelper
    是HtmlHelper的扩展,其中TModel是您的模型。在razor中,您可以像@Html一样使用HtmlHelper。因此,如果您不想将其用作扩展,您可以使用
    HtmlHelper(RegisterModel,m=>m.UserName)
    但其余的,是的,听起来不错。只是为了术语;它不解构表达式,而是用expression.Compile()方法编译它。是的,我想我已经了解了这一点,所以因为它是一个HtmlHelp,所以它会从内部引用我的RegisterModel的一个实例?因此,当我调用Html.LabelFor()时,它知道我的RegisterModel对象。(当不存在RegisterModel时,它会创建一个空白的吗?)对不起,如果我在这个问题上显得很愚蠢,只是想让我的头脑清楚一些。另外,当我说解构时,我的意思是,除了编译Lambda表达式外,它还必须使用表达式树来确定要查询的对象属性,例如[Display(Name)]?谢谢你-我希望我能给你评分,但是另一个答案排在第一位,我太新了,无法投票支持。你的帖子同样有用。再次感谢。
    <input type="text" name="Username" value="Dale Burrell">