即使没有指定模型类型,MVC View如何工作?

时间:2014-08-22 10:58:56

标签: c# asp.net-mvc asp.net-mvc-5

刚刚创建了一个简单的MVC 5应用程序。

创建一个控制器并调用我的视图:

var testClass = new TestClass();
testClass.Name = "Krish";
return View(testClass);

创建了一个视图,如下所示:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<h3>@Model.Name</h3>

但即使没有指定模型类型,这也可以正常工作。


Should not we specify something like:
`@Model TestClass`

任何想法为什么?

修改
MSDN的This页面说Represents a container that is used to pass strongly typed data between a controller and a view.我们并没有强烈输入上面的模型。那么视图如何找到模型类型呢?

2 个答案:

答案 0 :(得分:4)

cshtml视图(或vbhtml,如果您倾向于这种方式)实际上变成了一个继承自WebViewPage<TModel>的.NET类。

在视图中声明时

@model SomeType

你告诉MVC框架如此声明你的观点:

public class _Page_Path_To_MyView_cshtml : WebViewPage<SomeType> { ... }

当您省略@model声明时,框架会声明您的视图:

public class _Page_Path_To_MyView_cshtml : WebViewPage<dynamic> { ... }

有效地,没有@model声明的所有视图都可以被视为具有

@model dynamic

在顶部,这就是为什么你的@Model.Name仍然有效,但你会注意到它不会有智能感知(除非你不止一次使用它)。

如果您@Model.SomePropertyThatDoesntExist,您将获得例外。

答案 1 :(得分:1)

它可以通过这种方式工作,但是通常应该强烈地键入View.let通过一个例子理解这一点。

假设您有两个模型:

public class Model1
{
public string Name {get;set;}
}

public class Model2
{
public string FullName {get;set;}
}

现在,如果你在View中有这个:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<h3>@Model.Name</h3>

从您采取的行动:

var Model= new Model1();
Model.Name = "Ehsan";
return View(Model);

一切都会好的,但是如果你这样过去的话:

var Model= new Model2();
Model.FullName = "Ehsan Sajjad";
return View(Model);

现在您查看将抛出异常,因为此模型没有Name属性。