6

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

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

举个例子:

控制器:

public ActionResult countryDetails(int id)
    {

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

    }

看法:

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

控制器返回一个带有对象作为参数的视图,因此模型应该是已知的。如果很明显,我很抱歉,但我不明白为什么这不是“双重”声明。

谢谢你的帮助!

4

3 回答 3

7

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

  • 当您输入 @Model 或使用任何 Html 帮助程序扩展时,它将允许智能知道您使用的是什么类型。

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

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

Person Someone = new Person();
RenderView(Someone);
...
void RenderView(Person model) { }
于 2013-07-30T14:12:49.863 回答
3

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

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

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

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

@model List<CompanyName.MyProduct.MyCategory>

这种糖语法是为了简化代码输入。这个宣言给你一些东西

  1. 查看自动将对象转换为首选类型
  2. 您收到类型定义的“模型”属性,允许您访问对象方法和属性

只要相信这是一个接受对象并将其转换为您提供的指定类型的方法

于 2013-07-30T14:32:12.837 回答
1

主要原因是类型安全,它允许您使用智能感知、编译器错误提示、无效转换等优势使用强类型视图。

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

于 2013-07-30T14:12:14.477 回答