刚刚创建了一个简单的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.
我们并没有强烈输入上面的模型。那么视图如何找到模型类型呢?
答案 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
属性。