困惑于“;型号“;ASP.NET视图中的含义

本文关键字:视图 ASP 型号 NET | 更新日期: 2023-09-27 18:20:00

所以这里有一个来自asp.net上MSDN教程的视图文件:

@model EFDBfirst.Models.Student
@{
    ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
    <h4>Student</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.LastName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.LastName)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.FirstName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.FirstName)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.EnrollmentDate)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.EnrollmentDate)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.MiddleName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.MiddleName)
        </dd>
    </dl>
    <table class="table">
        <tr>
            <th>
                Course Title
            </th>
            <th>
                Grade
            </th>
            <th>
                Credits
            </th>
        </tr>
        @foreach (var item in Model.Enrollments)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Course.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Grade)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Course.Credits)
                </td>
            </tr>
        }
    </table>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.StudentID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

在第一行上有modelModels。我很确定Models指的是项目根目录中的"Models"文件夹。

下面几行是@Html.DisplayNameFor(model => model.LastName),里面有model。这个和第一行的model有什么不同?

还有@foreach (var item in Model.Enrollments),它包括Model,现在这个没有以"s"结尾,所以我不认为它指的是项目根目录中的Models文件夹。那这是什么?

还有modelItem,我不确定它是否只是一个参数,或者是指这个类中的某个东西。

最后一个是@Html.ActionLink("Edit", "Edit", new { id = Model.StudentID }),它与foreach中使用的类似,这指的是同一件事吗?

困惑于“;型号“;ASP.NET视图中的含义

@model EFDBfirst.Models.Student声明此视图中使用的模型为Student

在视图内部,您可以使用Model参考您的模型。因此,如果你想遍历你传递给这个视图的学生对象的Enrollments,你只需要这样做:

@foreach(var enrollment in Model.Enrollments)
{
}

关于这一点,@Html.DisplayNameFor(model => model.LastName)这是一个HTML助手,它将为您的模型的属性创建一个标签,在本例中称为LastName

关于html助手,请看这里。此外,您可以将以下行传递给该助手:

@Html.DisplayNameFor(m => m.LastName)

或者这行:

@Html.DisplayNameFor(x => x.LastName)

你使用model并不重要。这只是对您传递给视图的模型的引用。

最后但同样重要的是,这个@Html.ActionLink("Edit", "Edit", new { id = Model.StudentID })也是一个创建html链接的html助手。

@model EFDBfirst.Models.Student

这一行定义了这个强类型视图要使用的模型。@model是剃刀指令,允许您指定自己的型号。EFDBfirst.Models.Student是您的型号的完全合格类型。默认情况下,这与文件夹结构有关,但不是必须的。如果打开Student类,就会看到名称空间。namespace+类是第一行中的内容。

每个强类型视图都有一个与其关联的Model对象/属性。这是您通过操作方法传入的对象。return View(someObject)。您在foreach循环中看到的Model是视图的模型对象。CCD_ 27也指的是相同的对象。

您看到的小写model只是lambda表达式中参数的名称。这与您看到的modelItem相同。HTML助手将获取视图的Model并将其提供给表达式。由于它是一个表达式,因此可以根据需要为该参数命名。CCD_ 30。

第一行是model和Models。我确信Models引用了项目根目录中的"Models"文件夹。

与include语句或using语句类似,您声明此页面使用学生模型,该模型包含所有字段以及您可能需要的其他内容。这是一件有约束力的事情。。。页面被绑定到模型,该模型在显示时包含Student的实例。

下面几行是@Html.DisplayNameFor(model=>model.LastName)里面有模型。这个和里面的型号有什么不同第一行?

记住,所有的渲染都是在服务器端完成的,所以这句话是在对Razor说,为正在渲染的学生的模型实例中找到的名为LastName的属性渲染一个DisplayName(元素类型)。如果更有意义的话,第一个单词模型可以很容易地用"p"表示参数。第一个词可能会产生误导,但这就是MVC模板的作用

然后是@foreach(Model.Innrollments中的var项),它包括Model现在这个没有以"s"结尾,所以我不认为它指的是项目根目录中的Models文件夹。那这是什么?

每当您看到@foreach语句时,它都会告诉该控件的服务器端呈现遍历某些内容。在这种情况下,它将是学生对象"注册"列表。对于该学生的每次入学。。。

还有modelItem,我不确定它是只是一个参数还是指的是这一类的东西。

不要试图从字面上理解单词modelItem,因为您可以很容易地将其重命名为参数的"p"。这更像是一个Lambda表达式如何工作的问题?在这种情况下,DisplayFor需要设置一个字符串来知道要显示什么,modelItem之所以成为该字符串值,是因为它"转到"item.fieldname来获取它。你看不到的是一个显式的返回语句,如"return item.fieldename",因为在使用Lambdas时它是隐式理解的。

最后一个是@Html.ActionLink("编辑"、"编辑",new{id=Model.StudentID}),它与foreach中使用的类似,是这样吗指的是同一件事?

MODEL是student类型,它有一个StudentID字段,这就是您从"绑定"到此页面的student的对象(MODEL)中检索StudentID的方式。页面的DataContext是一个别名为MODEL的学生实例,MODEL有一个字段StudentID,单击后会返回到服务器端。