2011-03-03 42 views
2

使用MVC-3,剃刀:MVC-3和动态 - @ Html.Label(View.X)不渲染

- myController的 -

public ActionResult Index(String message) // where message = "hello" 
{ 
     ViewModel.Test1 = "This is a test"; 
     ViewModel.Test2 = "This is another test. " + message; 
} 

- Index.cshtml -

@Html.Label((string)View.Test1) 
<br /> 
@Html.Label((string)View.Test2) 

为什么它只渲染出以下内容?

<label for="This is a test">This is a test</label> 
<br /> 

在过去的几天里,我一直让我疯狂,似乎没有任何意义。必须有一个原因。

我可以调试这一点,并通过这个视图。在视图中,我注意到这行被处理,View.Test2的值是“This is another test。hello”。

我有我在做以下事情的情况下,它工作正常。
(前)

ViewModel.Something = this.readDataService.GetSomething(); 

有什么区别?

感谢,

罗布

回答

4

看起来你正在使用ASP.NET MVC的RC2预览版3 ViewModel改为ViewBag在RC 2(见this post由Scott Guthrie的)。

在ASP.NET MVC 3的早期预览中,我们使用Controller基类中名为“ViewModel”的动态属性以及视图模板中名为“View”的动态属性公开了此API。很多人发现有两个不同的名称令人困惑,还有一些人说,在这种情况下使用名称ViewModel会造成混淆 - 因为在ASP.NET MVC中经常会创建强类型的ViewModel类,并且它们不会使用这个API。

在RC2中,我们公开了一个动态属性,它在控制器和视图中都具有相同的名称 - ViewBag。

而且看起来好像您正尝试使用ViewModel作为视图的强类型模型。相反,创建一个类模型使用,然后使用@Html.LabelFor:在控制器

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

PersonModel model = new PersonModel { Name = "John" }; 
return View(model); 
视图

@Html.LabelFor(model => model.Name): @Html.TextBoxFor(model => model.Name) 

这使得:

<label for="Name">Name</label>: <input id="Name" name="Name" type="text" value="John" /> 

HTH

+0

漂流,谢谢你的回复。感谢提示让我的应用程序转移到最新的MVC。你是对的,我应该在所有这些观点中使用一个模型作为经验法则。我会走这条路,并保存ViewBag的头痛。(顺便说一下,我在迁移到较新的MVC之后测试了我的应用程序,但它仍然存在同样的问题。模型的时间!)再次感谢您的响应! – Rob 2011-03-04 05:16:51

+0

@Rob,很高兴我能帮忙:) – 2011-03-04 05:23:33