有点好奇与mvc视图中的动态类型

时间:2013-05-16 21:37:13

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

在这里用MVC破解我的头脑。

我把我的模型写成:

public class AboutModel
{
    public string AboutText { get; set; }
}

和我的控制器:

    public ActionResult About()
    {
        var model = new AboutModel { AboutText = "We build better software."};
        return View(model);
    }

并将new行更改为:

    AboutModel model = new AboutModel { AboutText = "We build better software."}

最后到:

   dynamic model = new AboutModel { AboutText = "We build better software."}

似乎一切都与我的View完美配合:

@model MvcApp.Models.AboutModel

<p>@if (Model != null)
{
    @Model.AboutText
}</p>

我的3个模型初始化有什么不同吗?

2 个答案:

答案 0 :(得分:2)

var model = new AboutModel是一个隐式类型变量,因为您不必事先指定变量的类型,编译器可以通过=后面的内容来推断它。 (在这种情况下为AboutModel

如果使用一个隐式类型变量,则必须为其赋值,例如:

var model = new AboutModel;

将编译,但

var model;

不会。

AboutModel model = new AboutModel指定变量声明中的类型,如果你在同一行中给它一个值,那么你真的不需要这样做。如果你在声明上给它一个类型,你不需要给它一个值。例如:

AboutModel model;

将编译。

dynamic关键字意味着它不会在编译时进行类型检查,在这种情况下也不会有任何区别。

答案 1 :(得分:0)

不,所有三种情况下的运行时类型都是MvcApp.Models.AboutModel

在前两种情况下,您按原样传递类型,在最后一种情况下,将其作为动态传递,将尝试将其强制转换为@model指令定义的视图类型。

为了清晰起见,我会坚持使用其中一种强类型初始化,除非您需要“动态性”(在这种情况下,您也希望将@model类型设置为dynamic)。