困惑于“;型号“;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>
在第一行上有model
和Models
。我很确定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中使用的类似,这指的是同一件事吗?
此@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,单击后会返回到服务器端。