0

プロジェクトMVC 5(4.5.1ではなく.NET 4.5)の下でW8.1でVS2013プレビューを使用しており、過去数時間、あらゆる種類のことを試して調査してきましたが、私が得たものが得られないようです行方不明です。

私はフォーラムを構築することで学校のプロジェクトに取り組んでおり、URL を階層的にしたい、つまり localhost:1234/Forum/Science/Physics/String%20Theory.

これは RouteConfig です:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{action}/{*title}",
            defaults: new { controller = "Home", action = "Index", title = UrlParameter.Optional }
        );
    }

コントローラ:

public ActionResult Index()
    {
        return View(db.Categories.Where(x => x.ParentId == null).ToList());
    }

public ActionResult Forum(string parentId)
    {
        return View("Index", db.Categories.Where(x => x.ParentId == parentId));
    }

そしてビュー(インデックスページです):

@foreach (var item in Model)
    {
        <div class="CatLevel0">
            <h2>@Ajax.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = item.Title }, new AjaxOptions() { HttpMethod = "POST" })</h2>
            <h4>@Html.DisplayFor(modelItem => item.Description)</h4>
        </div>
    }

ここに問題があります。上記のリンク (例: "Science") は次の場所に移動します: "http://localhost:1234/Forum/Science?parentId=b8bd9ded-7284-462d-b0cc-d8ce09717b8a"、および "Science" に転送されて "Social Sciences" にリダイレクトされた後の 2 番目のレベル: "http://localhost:1234/Forum/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3".

そのため、クエリ文字列で冗長な GUID を取得するだけでなく (これは望ましくありません!)、「~/Forum/Science/Social%20Sciences」の前駆体「Science」も失われます。

他のいくつかのSOの質問では、Ajax.ActionLinkにはjqueryの控えめなajaxが必要であることが指摘されました.Chrome Developer Toolsのネットワークタブで判断すると、私の側では正しくレンダリングされます。

更新:次を使用して、@TimothyWaltersが言及した問題を修正できました:

コントローラ:

public ActionResult Forum(string parentId, string title)
    {
        TempData["fullTitle"] = title + "/";
        return View("Index", db.Categories.Where(x => x.ParentId == parentId));
    }

意見:

@foreach (var item in Model)
    {
        <div class="CatLevel0">
            @*<h2>@Html.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = item.Title })</h2>*@
            <h2>@Ajax.ActionLink(item.Title, "Forum", new { parentId = item.Id, title = TempData["fullTitle"] + item.Title }, new AjaxOptions() { HttpMethod = "POST" })</h2>
            <h4>@Html.DisplayFor(modelItem => item.Description)</h4>
        </div>
    }

これhttp://localhost:5465/Forum/Science/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3で、クエリ文字列の GUID の問題が処理されます。

Update2 : うーん - 今私はこれを得る: http://localhost:5465/Forum/Science/Social%20Sciences/Science/Social%20Sciences?parentId=2a9f1c24-c6d4-44ab-b000-3268f38794f3. . . .

4

1 に答える 1

0

クエリ文字列に GUID を入れたくない場合は、そこに入れるのをやめてください。そこにない場合は、パスから意味を抽出する信頼できる方法が必要になります。

parentIdへの呼び出しに含めるビューのコードを使用して、GUID をクエリ文字列に入れるように明示的に指示していますActionLink()。そのパラメーターを削除すると、そこに GUID がなくなります。

パスから意味を抽出するには、「科学/物理学/ストリング理論」を、以前に GUID で見つけた親の「ストリング理論」の子に変換する方法が必要です。

var parts = title.Split('/');
var categories = db.Categories
    .Where(c => parts.Contains(c.Title))
    .ToList();

// start at the root
var category = categories.Where(c => c.ParentId == null && c.Title == parts[0]);

// look for anything past the root level (starting at index 1 not 0)
for (var i = 1; i < parts.Length; i++)
{
    category = categories.Where(c => c.ParentId == category.Id && c.Title == parts[i]);
}

// use category to create new view
return View(category);
于 2013-09-12T00:20:21.957 に答える