Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 从控制器中插入语句_Asp.net Mvc 3_Telerik Mvc - Fatal编程技术网

Asp.net mvc 3 从控制器中插入语句

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

我正在编写一个MVC 3应用程序,我尝试在控制器中编写一个控件(由于权限的原因,不同的用户可以看到不同的菜单项),并在Razor页面中使用该对象。例如,在
控制器中,我执行如下操作:

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是高度可定制的,允许您根据模型中的不同条件和值创建不同的标记。您到底想要实现什么?