我正在使用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))
答案 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。