2015-03-30 36 views
2

我想抓住客戶端機器的IP地址,然後爲它分配一個名稱。假設它是192.168.7.12,那麼該工作站將會有名稱「Head Board Assembly」,然後將其傳回到Layout視圖。分配名稱位不是問題,但是,我想將最終值傳遞給主佈局,而不是重複下面的代碼。忽略服務器IP方法,它在本地主機的早期階段。添加一個變量到佈局頁面MVC

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> 

感覺像IM重複自己每次加的代碼相同的部分,然後具有調用的方法和代碼轉換成其它控制器,因爲佈局從每個控制器方法調用查看包。

我覺得肯定會有更好的方法,因此我想在佈局主設備中分配IP名稱並設置一次。我不知道如何去這樣做,因爲佈局,是很好的layout.Also IVE一派的地獄它哈哈

+0

你知道你」重新顯示*服務器*的IP地址,對吧? – bzlm 2015-03-30 19:33:33

+0

是的,目前它只能用於本地主機上的展示目的,即時將添加客戶端一旦我到達項目結束。 – Matchbox2093 2015-03-30 19:37:58

回答

3

看來你想創建某種類型的靜態幫助器方法,它不僅可以獲取IP地址,還可以執行一些自定義邏輯。然後,您可以在佈局中的任何位置調用它。

「說,如果這是192.168.7.12則該工作站將有名稱爲 「頭板組裝」

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

歡迎@ MyApp.Helpers.GetIP.AssignedIPName()。

3

如果你的目的是爲了表明您應該使用

@Request.UserHostAddress 

將工作站的IP地址這在你的佈局頁面。在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); 
    } 
+0

謝謝Praveen :)但它是略有不同,我可能應該在我的問題中說明它*傻我*。我想抓住客戶端機器的IP地址,然後分配一個一直到它。假設它是192.168.7.12,那麼該工作站將會有名稱「Head Board Assembly」,然後將其傳回到Layout視圖。對不起,我忘了提及那一點,現​​在添加它....它目前在演示模式顯然哈 – Matchbox2093 2015-03-30 19:46:42

2

一個簡單的方法將是擴展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來查看任何視圖文件。兩者都是一樣的,但爲了清晰起見,我更喜歡後者。

1

爲什麼不使用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 
+0

謝謝@InvernoMuto做我想要的,並允許我通過視圖篩選,如果需要:) – Matchbox2093 2015-03-31 12:01:40