c# - 从局部 View 设置主 url 的路由值

标签 c# asp.net-mvc asp.net-mvc-routing partial-views

我正在开发一个多语言 ASP.NET MVC 网站,我需要一些帮助来从部分 View 的主要操作中设置语言。

我的默认路线声明为:

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

在我的 _Layout.cshtml 中,我将部分引用声明为:

@Html.Partial("_LanguagePartial")

此部分调用语言 Controller 中的操作:

@Html.Action("Index","Language")

此 Controller 操作只是将发布的语言泵送到 View :

public class LanguageController : BaseController
{
    //
    // GET: /Language/
    public PartialViewResult Index()
    {
        List<Language> languages = new List<Language>();
        foreach (Language language in Global.Data.Languages.Values)
        {
            if (language.IsReleased)
                languages.Add(language);
        }
        return PartialView(languages);
    }

    public ActionResult SelectLanguage(string code)
    {
        //I tried to change the route value here, but this only affects the route to this action
        var routeDataDict = HttpContext.Request.RequestContext.RouteData.Values;
        routeDataDict["language"] = code;
        return RedirectToRoute(routeDataDict);
    }
}

部分显示的实际 View 如下所示:

<div class="float-center">
<table><tr>
@foreach (var language in Model) {
    <td>
    <a href="@Url.Action("SelectLanguage", new { code = language.CultureCode })">
        <!--The css for the correct sprite is generated by language.Icon.ToString()
            The result will look like "background: url("/Images/Icons.png") -0px -100px; display: block; width: 32px; height: 20px; text-indent: -9999px;"-->
        <img alt="" src="" style="@Url.Content(@language.Icon.ToString());border=1" />
    </a>
    </td>
}
</tr></table>

现在,该部分内容会在网站的每个页面中呈现,就像它应该的那样,但是当我在 mydomain/en/SomeController/SomeAction 上并单击德语图标时,它应该将我带到 mydomain/de/SomeController/SomeAction。

当然, Action 和 Controller 不是固定的。

关于如何执行这样的操作有什么想法吗? 也许我已经实现了部分错误,如果我以不同的方式实现它,我将能够访问该路由。

编辑: 在 meilke 的回答的帮助下,我对语言 Controller 进行了以下编辑:

public ActionResult SelectLanguage(string code)
    {
        string url = ReplaceLanguageCode(Request.UrlReferrer.ToString(), code);
        return Redirect(url);
    }

    private string ReplaceLanguageCode(string url, string code)
    {
        Language language = GetLanguage(url);
        if (language == null)
        {
            //No Language is set in the url e.g. http://mydomain/
            string domain = Request.Url.AbsoluteUri.ToString().Replace(Request.Url.PathAndQuery, "");
            return url.Replace(domain, domain + "/" + code);
        }
        else
            //A Language was already set in the url e.g. http://mydomain/en/
            return url.Replace("/" + language.CultureCode + "/", "/" + code + "/");
    }

    private Language GetLanguage(string url)
    {
        //Loop the apps languages to see if one is set in the url
        foreach (Language language in Global.Data.Languages.Values)
        {
            if (url.ToLower().Contains("/" + language.CultureCode + "/"))
                return language;
        }
        return null;
    }

SetLanguage 操作已更改为使用 UrlReferrer,如 meilke 的回答所述。我还添加了 ReplaceLanguageCode 来创建新的 url,并添加了 GetLanguage 来获取语言(如果原始 url 包含语言)。

最佳答案

有一个与当前操作或当前 Controller 无关的通用 Controller ,并将SelectLanguage放在其中。然后使用 Request.UrlReferrer ( more information ) 让您回到原来的位置(现在使用正确的语言):

public ActionResult SelectLanguage(string code)
{
  // set language here

  return Redirect(Request.UrlReferrer.ToString());    
}

关于c# - 从局部 View 设置主 url 的路由值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426907/

相关文章:

asp.net - ASP.NET Web 应用程序程序集能否在运行期间被替换

c# - ASP.NET MVC 中的 WebApi [FromUri] 等价物是什么?

c# - MVC 路由识别段错误

c# - ASP.NET MVC2 从 jQuery 调用 AsyncController 方法?

带有 getter 的 Java For Each

c# - 如何在接口(interface)或基类中定义一个固定大小的数组

c# - "Security"和 ASP.NET 路由引擎的问题

c# - 发布到 Azure 错误 - 错误 : '' , 十六进制值 0x0F 是无效字符。 1 号线,位置 285

sql-server - 如何将大型二进制数据流式传输到 SQL Server

asp.net-mvc - 使用 Controller 操作方法中的绝对路径调用 View