ASP.Net MVC,动态属性和EditorFor / LabelFor

时间:2010-12-20 20:56:39

标签: asp.net-mvc asp.net-mvc-3 razor

我正在使用MVC 3 w / Razor并使用新的动态ViewBag属性。我想将ViewBag属性与EditorFor / LabelFor Html助手一起使用,但无法弄清楚语法。

View确实设置了@model,但我尝试使用的对象不是该模型的一部分。我知道我可以创建一个ViewModel,但这不是我想要的。

有人可以帮忙吗?

控制器:

   var myModel= _repo.GetModel(id);
   var newComment = new Comment();

   ViewBag.NewComment = newComment;

   return View(myModel);

查看:

@model Models.MyModel

@(Html.EditorFor(ViewBag.NewComment.Comment))

3 个答案:

答案 0 :(得分:5)

我没有尝试过,但我认为这应该可行。

@(EditorFor(m => ViewBag.NewComment)

可以使用Linq-to-SQL语法,但在右侧使用完全不同的对象。

答案 1 :(得分:1)

不知道你的评论模型是什么样的,我的直觉反应就是:

@Html.EditorFor(ViewBag.NewComment)

但是,由于ViewBag是动态的,因此您可能需要在使用之前投射NewComment,以获得EditorFor魔法。

@Html.EditorFor(ViewBag.NewComment as Comment)

更新

罢工,EditorFor只能接受一个Expression作为参数,并且该Expression必须返回页面模型的属性。如果您不想使用ViewModel,我认为EditorFor或EditorForModel对您没有任何用处。您是否考虑过使用Model的哪些角色切换ViewBag的角色?

答案 2 :(得分:1)

如果出于某种原因我需要使用ViewData将模型传递到我的视图中,我会执行以下操作以允许使用Html.DisplayFor()帮助程序。

在视图代码块中,我将ViewData模型对象转换为其基础类型

var newCommentModel = ( NewComment )ViewBag.NewComment;

然后我使用强类型引用

将以下表达式分配给助手
@Html.DisplayFor( model => newCommentModel )

表达式树现在包含一个强类型模型,并且正确显示了DisplayTemplate。