1

これは ASP.NET MVC (MVC3) での最初のプロジェクトであり、すべてを処理するのに多くの問題を抱えています。ページ内のすべてのテキストは、選択した言語に従ってデータベースから選択されます。この言語選択では、Session 変数を使用することを好みました。言語へのイメージ リンクが必要なので、次の行を .cshtml ページに書き込みました。

@using (Html.BeginForm()) {
    <a href='<%: Url.Action("Index", "Home", new { lang="Tr" }) %>'>
        <img src="../../Content/Images/flag_tr.jpg" width="40" height="20" />
    </a>
    <a href='<%: Url.Action("Index", "Home", new { lang = "En" }) %>'>
        <img src="../../Content/Images/flag_en.jpg" width="40" height="20" />
    </a>
}

そしてHomeControllerで:

    public ActionResult Index()

        ViewBag.Message = "Welcome to ASP.NET MVC!";
        ViewBag.Selected = "Not yet selected";
        return View();
    }

    [HttpPost]
    public ActionResult Index(String lang)
    {
        if (lang == "Tr")
        {
            System.Web.HttpContext.Current.Session["Language"] = "Tr";
        }
        else if (lang == "En")
        {
            System.Web.HttpContext.Current.Session["Language"] = "En";
        }
        ViewBag.Selected = System.Web.HttpContext.Current.Session["Language"];
        return View();
    }

フラグ リンクをクリックすると、「HTTP エラー 400 - 不正な要求」が表示されます。誰かが私が間違っていること、または何をすべきか教えてもらえますか?

PS:フォームなしでも試してみました.Langという名前のコントローラーに新しい関数を追加し、そこからインデックスにリダイレクトしましたが、成功しませんでした.

4

2 に答える 2

1

Razor と WebForms の構文が混在しているようです。ページで「ソースを表示」すると、アンカーに正しい URL が表示されないと確信しています。

<a href='<%: Url.Action("Index", "Home", new { lang="Tr" }) %>'>

次のようにする必要があります。

<a href='@Url.Action("Index", "Home", new { lang="Tr" })'>

また、アンカーはフォームであっても HTTPGET を引き起こすことに注意してください。そのため、JavaScript でアンカーの動作をオーバーライドするかlang、コントローラ アクションの HTTPGET バージョンにチェックを追加する必要があります。2 つのコントローラー アクションを 1 つにまとめて、次のようにしてみてください。

public ActionResult Index(string lang)
{
    if (lang == "Tr")
    {
        System.Web.HttpContext.Current.Session["Language"] = "Tr";
    }
    else if (lang == "En")
    {
        System.Web.HttpContext.Current.Session["Language"] = "En";
    }

    ViewBag.Message = "Welcome to ASP.NET MVC!";
    ViewBag.Selected = System.Web.HttpContext.Current.Session["Language"] ?? "Not yet selected";
    return View();
}

これを[HttpGet]または[HttpPost]で装飾しない場合、すべての HTTP 動詞がこのアクションにマップされます。

于 2012-12-03T05:07:10.493 に答える