困惑于"模特" ASP.NET视图中的含义

时间:2015-10-30 19:01:23

标签: c# asp.net-mvc

所以这是来自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 是指&#34;模型&#34;项目根目录中的文件夹。

在那里有几行@Html.DisplayNameFor(model => model.LastName)里面有model。这个如何与第一行中的model不同?

然后再次出现@foreach (var item in Model.Enrollments) Model,其中包含Models现在这个人并没有结束&#34;#34;所以我不认为它指的是项目根目录中的modelItem文件夹。这是什么?

还有@Html.ActionLink("Edit", "Edit", new { id = Model.StudentID }),我不确定它只是一个参数,还是指这个类中的内容。

最后一个是IS ,它与foreach中使用的类似,这是指同一件事吗?

3 个答案:

答案 0 :(得分:6)

int sort(int*X,int N,int fir){ if (N==2){ if(X[fir]<=X[fir+1]) { return 1; } else if(sort(X,N-1,fir+1)==1) { if (X[fir]<=X[fir+1]) { return 1; } else { return -1; } } } else { return -1; } } 声明此视图中使用的模型是@model EFDBfirst.Models.Student

在您查看的内部,您可以使用Student来引用您的模型。因此,如果您希望迭代通过此视图的学生对象的Model,则只需执行此操作:

Enrollments

对此,@foreach(var enrollment in Model.Enrollments) { } 这是一个HTML帮助程序,在这种情况下将为您创建一个名为@Html.DisplayNameFor(model => model.LastName)的模型属性的标签。

关于html帮助者,请查看here。此外,您可以将此行传递给此帮助程序:

LastName

或这一行:

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

您使用@Html.DisplayNameFor(x => x.LastName) 并不重要。这只是对传递给View的模型的引用。

最后但同样重要的是,此model也是一个创建html链接的html助手。

答案 1 :(得分:3)

@model EFDBfirst.Models.Student

这一行定义了这个强类型视图将使用的模型。 @model是允许您指定模型的razor directiveEFDBfirst.Models.Student是您的模型的完全限定类型。默认情况下,这与您的文件夹结构有关,但并非如此。如果打开Student类,您将看到命名空间。命名空间+类是第一行中的内容。

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

您看到的小写model只是lambda expression中参数的名称。这与您看到的modelItem相同。 HTML帮助程序将使用您的视图模型并将其提供给表达式。由于它是一个表达式,您可以将此参数命名为您想要的任何名称。 Html.DisplayFor(foo => foo.FirstName)

答案 2 :(得分:2)

  

第一行有模型和模型。我非常确定模型是指&#34;模型&#34;项目根目录中的文件夹。

与include语句或using语句类似,您声明此页面使用的学生模型包含所有字段以及您可能需要的其他内容。它是一个绑定的东西......页面绑定到模型,当显示它时包含Student的实例。

  

在那里排了几行@ Html.DisplayNameFor(model =&gt; model.LastName)   其中有模型。这个与模特有什么不同?   第一行?

记住所有渲染都是在服务器端完成的,所以这个语句对Razor说,渲染我一个DisplayName(元素类型),对于在该渲染的学生的模型实例中找到的名为LastName的属性。第一个单词模型很容易就是&#39; p&#39;对于参数,如果它更有意义。第一个词可能会产生误导,但MVC模板是如何做到这一点的。

  

然后再次出现@foreach(Model.Enrollments中的var项)   包括模型现在这个没有结束&#34;#34;所以我不认为   它指的是项目根目录中的Models文件夹。这是什么?

任何时候你看到一个@foreach语句,这告诉服务器端渲染这个控件来迭代一些东西。在这种情况下,它将是学生对象注册列表。对于这名学生的每次报名......

  

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

请勿尝试逐字地理解modelItem,因为您可以轻松地将其重命名为“&#39; p&#39;用于参数。这是Lambda表达式如何工作的问题?在这种情况下,DisplayFor需要设置一个字符串来知道要显示的内容,modelItem成为该字符串值,因为它会转到&#39; item.fieldname得到它。你不会看到的是一个明确的退货声明,例如&#34; return item.fieldname&#34;因为在使用Lambdas时会隐含地理解它。

  

最后一个是@ Html.ActionLink(&#34;编辑&#34;,&#34;编辑&#34;,新{id =   Model.StudentID}),它与foreach中使用的类似,就是这个   指同样的事情?

MODEL是学生类型,它有一个StudentID字段,这就是你如何从学生的对象(模型)中检索学生ID,这是&#34; Bound&#34;到这个页面。该页面的DataContext是一个别名为MODEL的学生实例,MODEL有一个字段StudentID,点击后会回发到服务器端。