Asp.net mvc 3 从控制器中插入语句
我正在编写一个MVC 3应用程序,我尝试在控制器中编写一个控件(由于权限的原因,不同的用户可以看到不同的菜单项),并在Razor页面中使用该对象。例如,在Asp.net mvc 3 从控制器中插入语句,asp.net-mvc-3,telerik-mvc,Asp.net Mvc 3,Telerik Mvc,我正在编写一个MVC 3应用程序,我尝试在控制器中编写一个控件(由于权限的原因,不同的用户可以看到不同的菜单项),并在Razor页面中使用该对象。例如,在控制器中,我执行如下操作: public ActionResult Index() { var menu = "@(Html.Telerik().Menu().Name("menu").Items("menus => { menus.Add().Text("Home").Action("Index", "Home"); menus
控制器中,我执行如下操作:
public ActionResult Index()
{
var menu = "@(Html.Telerik().Menu().Name("menu").Items("menus => { menus.Add().Text("Home").Action("Index", "Home"); menus.Add().Text("Deliveries").Action("Index", "Delivery"); }))";
var model = new MenuModel()
{
Menu = menu
};
return View(model);
}
在视图中
我尝试使用@Model.Menu
呈现菜单,但我只得到字符串
值,而不是实际的菜单。我想做的是可能的吗?扩展HtmlHelper
类,并使用新创建的方法在视图中呈现菜单:
助手:
public static string RenderMenu(this HtmlHelper html)
{
var menu = new StringBuilder();
/* ... menu rendering logic ... */
return menu.ToString();
}
@Html.RenderMenu();
查看:
public static string RenderMenu(this HtmlHelper html)
{
var menu = new StringBuilder();
/* ... menu rendering logic ... */
return menu.ToString();
}
@Html.RenderMenu();
尽管如此,我们还是可以将这一逻辑纳入考虑范围。使用HtmlHelper
扩展只会分离/清理代码。为什么要这样做?这打破了MVC中关注点的分离——您的控制器不应该担心菜单的显示方式,只需要将正确的数据显示到视图中即可
如果要进行安全性修剪,请不要传入生成器字符串。还有其他可用的方法
您可以尝试使用,它可以根据[Authorize]控制器属性处理安全性调整(需要学习和设置一些工作,但一旦有了它就很棒了)
传入您自己的标志或预构建菜单项集合
创建一个HtmlHelper扩展,类似于“IsAuthorized()”,它将根据控制器授权属性进行检查。在切换到MVC站点地图之前,我使用的一个
使用html助手,您可以执行以下操作:
@(Html.Telerik().Menu()
.Name("Menu")
.Items(m =>
{
@* Publicly Accessible Controller *@
m.Add()
.Text("Home").Url(Url.Action("Index", "Home"));
@* Secure Controller *@
if (Html.IsAuthorized<MyProject.Controllers.SecureController>(c => c.Index()))
{
//m.Add()....
}
.....
@(Html.Telerik()菜单()
.名称(“菜单”)
.项目(m=>
{
@*可公开访问的控制器*@
m、 添加()
.Text(“Home”).Url(Url.Action(“Index”,“Home”));
@*安全控制器*@
如果(Html.IsAuthorized(c=>c.Index()))
{
//m、 添加()。。。。
}
.....
即使可能,我也不想那样做
您应该解耦控制器并查看比当前更多的内容
控制器应仅传递视图所需的数据。如果视图需要具有不同菜单项的菜单,则使用控制器确定视图应具有哪些菜单项,然后将其添加到列表对象并将该列表传递给视图。然后视图将基于菜单项列表构建菜单
另外,当我说“菜单项”时,我不是指标记!我的意思是创建一个新的MenuItemViewModel对象,以在控制器和视图之间保存数据,例如伪代码:
public class MenuItemViewModel { string url, string text }
List<MenuItemViewModel> menuitems ...
return View(menuitems)
public类MenuItemViewModel{string url,string text}
列表菜单项。。。
返回视图(菜单项)
为什么要在控制器中使用Razor?此代码属于视图。不要将控制器逻辑与表示逻辑混合使用。我无法将Razor逻辑放在Razor视图中,因为我不知道在那一点上它将是什么。为什么你不知道在那一点上它将是什么?Telerik helpers是高度可定制的,允许您根据模型中的不同条件和值创建不同的标记。您到底想要实现什么?