在mvc4 asp.net中的Razor View中的模型声明

时间:2013-07-30 14:08:27

标签: asp.net asp.net-mvc-4

我是asp.net mvc4的新手,有些东西我不太懂。

为什么我必须在视图顶部使用@model声明模型,如果我已经将对象传递给控制器​​中的View。

举个例子:

控制器:

public ActionResult countryDetails(int id)
    {

        Country country = db.Country.Find(id);
        return View(country);

    }

查看:

@model MvcApplication2.Models.Country
@{
    ViewBag.Title = "countryDetails";
}
...

控制器返回一个以对象作为参数的View,因此该模型应该是已知的。我很抱歉,如果这是显而易见的,但我无法弄清楚为什么这不是一个“双重”声明。

谢谢你的帮助!

3 个答案:

答案 0 :(得分:7)

顶部的声明将为您做两件事:

  • 当你输入@Model或使用任何Html帮助扩展时,它将允许intellisence知道你正在使用什么类型。

  • 它还会在运行时检查传入的模型是否可以转换为视图所期望的类型。

它不一定是“双重声明”,因为它类似于为方法上的参数指定类型。像这样

Person Someone = new Person();
RenderView(Someone);
...
void RenderView(Person model) { }

答案 1 :(得分:2)

默认情况下,您的视图会继承自System.Web.Mvc.WebViewPage<TModel>

您可以选择覆盖此类,它是默认的ASP.NET继承机制:

@inherits System.Web.Mvc.WebViewPage<List<CompanyName.MyProduct.MyCategory>>

或者你可以简化这个,因为MVC3是这样的:

@model List<CompanyName.MyProduct.MyCategory>

这种糖语法用于简化代码输入。 这个声明给你一些东西

  1. 查看自动将对象转换为首选类型
  2. 您会收到允许您访问的类型定义的“模型”属性 到您的对象方法和属性
  3. 请相信这是一个接受对象并将其强制转换为您提供的指定类型的方法

答案 2 :(得分:1)

主要原因是类型安全性,它允许您使用强类型视图,利用intellisense,编译器错误提示,无效转换等工作。

另外,另一个原因是可读性 - 它可以提醒您实际处理的是什么类型的模型,而不必继续引用控制器。