我想获取客户端机器的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