Asp.net mvc 4 使用Ajax.ActionLinks进行MVC 4主题切换

Asp.net mvc 4 使用Ajax.ActionLinks进行MVC 4主题切换,asp.net-mvc-4,actionlink,asp.net-mvc-partialview,Asp.net Mvc 4,Actionlink,Asp.net Mvc Partialview,此问题的全文可通过屏幕截图获得 感谢您的帮助-原始帖子如下: 因此,我下载了MvcMusicStore并启动了已完成的项目。我阅读了所有关于扩展视图引擎和使用jquery插件的文章,但我想相信,单击链接时只更改CSS文件路径可能比这更简单。主要是因为我不想一字不差地复制我不完全理解的代码。我对MVC很陌生 这就是我所做的: 在HomeController.cs中,我添加了: public ActionResult Theme(string themeName) {

此问题的全文可通过屏幕截图获得

感谢您的帮助-原始帖子如下:

因此,我下载了MvcMusicStore并启动了已完成的项目。我阅读了所有关于扩展视图引擎和使用jquery插件的文章,但我想相信,单击链接时只更改CSS文件路径可能比这更简单。主要是因为我不想一字不差地复制我不完全理解的代码。我对MVC很陌生

这就是我所做的:

在HomeController.cs中,我添加了:

    public ActionResult Theme(string themeName)
    {
        ViewBag.Theme = ThemeModel.GetSetThemeCookie(themeName);
        return View();
    }
我在模型中添加了此类:

public class ThemeModel
{
    public static string GetSetThemeCookie(string theme)
    {
        HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userTheme");
        string rv = "Blue";
        if (theme != null)
            rv = theme;
        else
        {
            if (cookie != null)
                rv = cookie["themeName"];
            else
                rv = "Blue";
        }

        cookie = new HttpCookie("userTheme");
        HttpContext.Current.Response.Cookies.Remove("userTheme");
        cookie.Expires = DateTime.Now.AddYears(100);
        cookie["themeName"] = rv;
        HttpContext.Current.Response.SetCookie(cookie);
        return rv;

    }
}
然后我创建了Site.css的两个副本,只更改了背景颜色和字体系列以及一个视图来生成我的链接标签

<link href="@Url.Content(string.Format("~/Content/{0}.css", ViewBag.Theme))" rel="stylesheet" type="text/css" />
HomeController.cs

    public ActionResult Theme(string themeName)
    {
        ViewBag.Theme = ThemeModel.GetSetThemeCookie(themeName);
        return PartialView();
    }
但是,即使这停止了重复渲染,当我单击主题链接时,颜色也会改变,但我在页面上完全看不到其他内容

现在真的很困惑,需要一些帮助

干杯,
.pd.

好的-下面是我最后的做法

创建一个javascript文件。我的名字叫master.js:

function ajaxSuccSetTheme(theme) {
    $('#linkTheme').attr('href', '/Content/' + theme + '.css');
}
修改_Layout.cshtml:

@{Html.RenderAction("Theme", "Home");}
@{
    if (ViewBag.Theme == null) {
        ViewBag.Theme = MvcMusicStore.Models.ThemeModel.GetSetThemeCookie();
    }
}
<link id="linkTheme" href="@Url.Content(string.Format("~/Content/{0}.css", ViewBag.Theme))" rel="stylesheet" type="text/css" />

<script src="@Url.Content("~/Scripts/jquery-2.0.3.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/master.js")" type="text/javascript"></script>
老实说,如果不检查
IsAjaxRequest()
IsAjaxRequest(),只返回null并不重要,因为我们需要设置cookie,以便它记住您下次登录的时间

这只会在ThemeModel中保留cookie设置方法:

public class ThemeModel
{
    public static string GetSetThemeCookie(string theme = null)
    {
        HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userTheme");
        string rv = "Blue";
        if (theme != null)
            rv = theme;
        else
        {
            if (cookie != null)
                rv = cookie["themeName"];
            else
            {
                cookie = new HttpCookie("userTheme");
                rv = "Blue";
            }
        }

        cookie.Expires = DateTime.Now.AddYears(100);
        cookie["themeName"] = rv;
        HttpContext.Current.Response.SetCookie(cookie);
        return rv;

    }
}
希望我帮助了别人。如果您更愿意在jQuery中完成这一切,下面是

干杯


.pd.

好的-下面是我最后的做法

创建一个javascript文件。我的名字叫master.js:

function ajaxSuccSetTheme(theme) {
    $('#linkTheme').attr('href', '/Content/' + theme + '.css');
}
修改_Layout.cshtml:

@{Html.RenderAction("Theme", "Home");}
@{
    if (ViewBag.Theme == null) {
        ViewBag.Theme = MvcMusicStore.Models.ThemeModel.GetSetThemeCookie();
    }
}
<link id="linkTheme" href="@Url.Content(string.Format("~/Content/{0}.css", ViewBag.Theme))" rel="stylesheet" type="text/css" />

<script src="@Url.Content("~/Scripts/jquery-2.0.3.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/master.js")" type="text/javascript"></script>
老实说,如果不检查
IsAjaxRequest()
IsAjaxRequest(),只返回null并不重要,因为我们需要设置cookie,以便它记住您下次登录的时间

这只会在ThemeModel中保留cookie设置方法:

public class ThemeModel
{
    public static string GetSetThemeCookie(string theme = null)
    {
        HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userTheme");
        string rv = "Blue";
        if (theme != null)
            rv = theme;
        else
        {
            if (cookie != null)
                rv = cookie["themeName"];
            else
            {
                cookie = new HttpCookie("userTheme");
                rv = "Blue";
            }
        }

        cookie.Expires = DateTime.Now.AddYears(100);
        cookie["themeName"] = rv;
        HttpContext.Current.Response.SetCookie(cookie);
        return rv;

    }
}
希望我帮助了别人。如果您更愿意在jQuery中完成这一切,下面是

干杯

警察局