向布局页面MVC添加一个变量



我想获取客户端机器的IP地址,然后为其分配一个名称。假设它是192.168.7.12,则该工作站将具有名称"Head Board Assembly",然后将其传递回Layout视图。分配名称位不是问题所在,但是,我想将结束值传递给主布局,而不是重复下面的代码。忽略服务器IP方法,它在本地主机上处于早期阶段。

HomeController.cs

    public class HomeController : Controller
{

    [Authorize]
    public ActionResult Index()
    {
        ViewBag.HtmlStr = "Workstation name: " + IP(); 
        return View();
    }

    [Authorize]
    public ActionResult Tutorial()
    {
        ViewBag.HtmlStr = "Workstation name: " + IP(); 
            return View();
    }
    [Authorize]
    public ActionResult Contact()
    {
        ViewBag.HtmlStr = "Workstation name: " + IP(); 
        return View();
    }
    public string IP() 
    {
        string myHost = System.Net.Dns.GetHostName();
        string myIP = null;
        for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
        {
            if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
            {
                myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
            }
        }
        return myIP;
    }

layout.cshtml

  <section id="login">
                          <p>@ViewBag.HtmlStr</p>
                    </section>

我觉得我重复自己每次添加相同的代码段,然后不得不将该方法和代码调用到其他控制器中,因为布局从每个控制器方法调用视图包。

我觉得肯定有更好的方法,所以我想在布局主控中设置IP分配名称,并设置一次。我不知道该怎么做,因为布局很好。我还在谷歌上搜索了一下,哈哈

您似乎想要创建一个静态辅助方法,它不仅可以获取IP地址,还可以执行一些自定义逻辑。然后您可以在布局中的任何位置调用它。

假设是192.168.7.12,那么该工作站的名称将为"Head Board Assembly"

namespace MyApp.Helpers
{
    public static class GetIP
    {
        public static string AssignedIPName()
        {//do custom logic
        }
     }
}

欢迎@MyApp。帮助者。GetIP。AssignedIPName()。

如果您的目标是显示工作站IP地址,您应该使用

@Request.UserHostAddress 

将其放置在布局页面中。当在localhost上运行时,您可能会看到:1,但当部署在web服务器上时,您会看到正确的结果。

如果您需要显示映射名称,可以执行以下

在布局中添加

<div id="machine"></div>

还有一个js来获取名称映射。

<script type="text/javascript">
        $(document).ready(function () {
            $.ajax({
                url: "Home/Machine"
            }).done(function (data) {
                $('#machine').text(data);
            });
        });
</script>

最后在您的家庭控制器

public JsonResult Machine()
    {
        string ip = Request.UserHostAddress;
        //Find the mapped name and return.
        //Need to add your logic here.
        return Json("Head Board Assembly", JsonRequestBehavior.AllowGet);
    }

一个简单的方法是扩展WebViewPage以添加您自己的额外属性。

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    public string SomeProperty
    {
        get
        {
            return someValue;
        }
    }
}

接下来在Views文件夹的web.config文件中找到这一行:

<pages pageBaseType="System.Web.Mvc.WebViewPage">

并将其更改为您新创建的BaseViewPage:

<pages pageBaseType="Your.App.Namespace.BaseViewPage">

然后,只需简单地调用@SomeProperty@base.SomeProperty,就可以在任何视图文件中使用它。两者都是一样的,但为了清楚起见,我更喜欢后者。

为什么不使用actionFilter?似乎是交叉关注的典型场景,因此:

public class IPActionFilter : ActionFilterAttribute
     {
          public override void OnActionExecuting(ActionExecutingContext context)
          {
               ViewBag.HtmlStr = "Workstation name: " + IP();
          }
     }

和你的行动:

[IPActionFilter]
[Authorize]
    public ActionResult Index()
    {

        return View();
    }

或者更好的是,装饰你的控制器,使其具有控制器的每种方法的功能:

[IPActionFilter]
public class HomeController : Controller

最新更新