2010-12-20 99 views
3

我使用MVC 3 w/Razor并使用新的动态ViewBag属性。我想用EditorFor/LabelFor Html助手使用ViewBag属性,但无法弄清楚语法。ASP.Net MVC,动态属性和EditorFor /标签

该视图确实有@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)) 

回答

5

我还没有尝试过,但这应该工作,我认为。

@(EditorFor(m => ViewBag.NewComment) 

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

+0

做这个工作? – 2013-04-19 09:01:42

+1

@bahadirarslan这不起作用(表达式树不能包含动态表达式)。作为一种可能的解决方法,您可以将动态模型转换为其基础类型(请参阅我对此解决方法的回答)。 – 2014-05-15 11:10:25

+0

这对定制编辑器也不起作用。例如,在你的模型上使用像这样的'[DataType(DataType.Html),UIHint(“tinymce_jquery_full”),AllowHtml]'的UIHint。最好创建一个局部视图并将模型对象传递给它。 – 2016-02-15 16:38:31

1

不知道您的评论模型是什么样子,我的直觉反应是只做到:

@Html.EditorFor(ViewBag.NewComment) 

然而,因为ViewBag是动态的,您可能需要在使用它之前投射NewComment,以获得EditorFor mag我知道了。

@Html.EditorFor(ViewBag.NewComment as Comment) 

更新

罢工,EditorFor只能接受一个表达式作为参数,并表达必须返回页面模型的属性。如果您不想使用ViewModel,我认为EditorFor或EditorForModel不会对您有任何用处。你有没有考虑将你使用Model的角色与ViewBag的角色进行切换?

+0

您的意思是“您是否考虑过切换角色,无论您使用的是模型还是VIEWMODEL”?否则,我不确定你的意思。 – 2010-12-20 23:14:52

+0

嗨,我的意思是EditorFor似乎适合与页面的模型一起使用。这当然是我一直使用它的方式。但是我可以看到你想要达到的目标。我的意思是,你目前正在从你的资源库中分配一个模型到页面模型。如果您将回购模型分配给ViewBag并将评论分配给页面模型会怎么样?你的观点可能吗?你能详细说明你为什么不想使用ViewModel吗? – kim3er 2010-12-20 23:37:06

+0

我在页面上使用了几个模型,所以我不能只交换一个模型。令人沮丧的是我认为这是可能的(或应该是),只是不知道语法。 – 2010-12-22 02:37:24

1

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

在视图代码块I铸的ViewData模型对象到其基础类型

var newCommentModel = (NewComment)ViewBag.NewComment; 

然后我使用强类型的参考

@Html.DisplayFor(model => newCommentModel) 

表达分配以下表达式来辅助树现在包含一个强类型模型,DisplayTemplate正确显示。