-1

私はMVCとC#に本当に慣れていないので、_Layout.cshtmlを変更してメニューを表示し、メニュー項目をクリックすると、クリックした親に基づいてサブメニュー項目を作成するjquery関数があります。サブメニューのリンクをクリックすると、マスターページがリロードされ、気に入らないサブメニューがクリアされます。ページのリロード後に同じサブメニューを動的に再作成するのを誰かが手伝ってくれますか、またはその問題を修正するアイデアは大歓迎です OK メニューバーを作成するために _Layout でアクセスしているコントローラーを作成しました

 public abstract class MainController : Controller
    {
        private static HRMenuDataContext db = new HRMenuDataContext();
        public static string theVal, toCheck;
        public static int num;
        public static HRMenuDataContext theData
        {
            get { return db; }
        }

        public MainController()
       {
           //ViewData["Parent"] = from c in theData.psHCMLanguages
           //                     where
           //                         (from m in theData.psHCMMenus
           //                          where
           //                             m.sModule == "AP"
           //                          select m.sMainRef
           //                         ).Distinct().Contains(c.szCode)

           //                     select c;

           ViewData["parent"] = theData.theParent("HR");

           ViewData["check"] = theData.doCheck(toCheck);

           ViewData["Child"] = from c in theData.psHCMLanguages
                               where
                                   (from m in theData.psHCMMenu_1s
                                    let parent = theVal
                                    where
                                      m.sModule == "HR" &&
                                      m.sSubRef == parent
                                    select
                                        m.sPrompt
                                    ).Contains(c.szCode)

                               select c; 

        }
    }

私の_Layout.cshtmlにはこれがあります

@using Menus.Data;
@using Menus.Controllers;
@using System.Linq;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - Persol Systems</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    <link href="~/Content/theStyle.css" rel="stylesheet" />
    <style type="text/css">
        #theSide {
            clear:both;
            position:relative;
            float:left;
            left:100px;
            bottom:50px;
            top:0;
            border:1px solid red;
            width:150px;
            height:600px;
        }
    </style>
</head>
<body>
    @{
        string[] name;
        char[] sep = { ' ', '/', '\\', '.' };
        string mess="";
     }
    <header>
        <div class="content-wrapper">
            <div class="float-left">
                <p class="site-title">@Html.ActionLink("your logo here", "Index", "Home")</p>
            </div>
            <div class="float-right">
                <section id="login">
                    @Html.Partial("_LoginPartial")
                </section>
                <nav>
                    <ul id="menux">
                        @{
                            foreach (var c in (IEnumerable<theParentResult>)ViewData["parent"])
                            {

                            <li><a>@c.English </a>
                                @{MainController.theVal = c.szCode;}

                                <ul class="firstChild">
                                    @{foreach (var d in (IEnumerable<psHCMLanguage>)ViewData["Child"])
                                      {
                                          var data = MainController.theData.doCheck(d.szCode);

                                          if ((int)data == 1)
                                         {  
                                             <li><a onclick="theAlert('@d.szCode','@d.English')">@d.English</a>
                                            @{
                                              MainController.theVal = d.szCode;
                                            }

                                         </li>  
                                          }

                                          else if (data == 0)
                                          {
                                              name = d.English.Split(sep);
                                              foreach (string nams in name)
                                              {
                                                  mess += nams;
                                              }
                                            <li>
                                                <a onclick="theAlert('@d.szCode','@d.English')">@d.English</a>
                                                @*@Html.ActionLink(d.English, mess, c.English)*@

                                            </li>
                                              mess = "";
                                              Array.Clear(name, 0, name.Length);
                                          }
                                      }
                                    }
                                </ul>
                            </li>

                            }
                        }
                    </ul>
                </nav>
            </div>
        </div>
    </header>

    <div id="body">  
        <div id="theSide">
            <ul id="sidePanel">

            </ul>
        </div>
        @RenderSection("featured", required: false)
        <section class="content-wrapper main-content clear-fix">
                  @RenderBody()
        </section>
    </div>
    <footer>
        <div class="content-wrapper">
            <div class="float-left">
                <p>&copy; @DateTime.Now.Year - Persol Systems</p>
            </div>
        </div>
    </footer>

    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts", required: false)
    <script type="text/javascript">
        function theAlert(theId, theName) {
            $("ul#sidePanel").contents().remove();
            $("ul#sidePanel ").append("<li id='" + theId + "'><a >" + theId + "</a></li>");
            $("li#" + theId + "> a").click(function (e) {
                window.location.href("../Home/About");
            });
            return false;
        }
    </script>
</body>
</html>

リンクをクリックすると、ページ全体がリロードされ、サイドパネルがクリアされます

4

2 に答える 2

0

シーン例

モデル

public class Menu
{
    // prop parent for example 
    public List<Parents> parents{ get; set; }
    // prop child
    public List<Childs> child{ get; set; }
    // prop check
    public bool checked { get; set; }
}

コントローラ

public class Menu: Controller
{
    public ActionResult _MainMenu()
    {
        Menu menu = new Menu();
        menu.Parent = // parent elements from your db context
        menu.Child = // child elements from your db context
        menu.Parent = // check element from your db context

        return PartialView(menu);
    }
}

_MainMenu.cshtml

@model Menu

// same like your layout view, fill here like layout
// for example
@foreach(var parent in Model.Parents)
{
    // generate menus
    ....
 }

_Layout.cshtml

...
<nav>
    <ul id="menux">
         @Html.Action("_MainMenu", "Menu")
    </ul>
</nav>
...

必要なデータ型を変更する必要があるコード例をお勧めします。

于 2013-03-05T13:58:26.300 に答える
0

HTTP はステートレスです。つまり、保持しないデータはポストバック間で失われます。その情報を保持したい場合は、Javascript を使用してメニュー構造を Ajax 経由でサーバーに送信するか、ブラウザ ベースのローカル ストレージを使用する必要があります。

于 2013-03-05T12:57:25.620 に答える