2017-02-17 190 views
0

我試圖簡單地顯示用戶名,就像它在我的Create.cshtml頁面的特定字段中的_LoginPartial.cshtml上一樣。User.Identity.GetUserName()不會顯示任何東西

我有這樣的頂部:

@using Microsoft.AspNet.Identity 

而在CSHTML我:

<div class="form-group"> 
      @Html.LabelFor(model => model.CreatedBy, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="form-control-static"> 
       @Html.Display(User.Identity.GetUserName()) 
       @Html.Hidden(User.Identity.GetUserName()) 
       @Html.ValidationMessageFor(model => model.CreatedBy, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

但是,當網頁顯示,儘管內置的出現在頂部的用戶名部分,它不會顯示出它應該在表格中的位置。什麼都沒有出現。沒有錯誤。

+0

請注意你的標籤 - 當它說不要用,那麼請不要使用。 –

回答

0

所以事實證明,只有這樣,我可以管理當前用戶的電子郵件傳遞到創建頁面來創建新模型的實例,並在控制器的GET方法中設置「CreatedBy」屬性,然後將該模型傳遞給視圖並使用DisplayFor。

public ActionResult Create() 
    { 
     NewUser nu = new NewUser(); 
     nu.CreatedBy = User.Identity.Name; 
     ViewBag.DepartmentId = new SelectList(db.departments, "DepartmentId", "DepartmentName"); 
     ViewBag.LocationId = new SelectList(db.locations, "LocationId", "LocationName"); 
     return View(nu); 
    } 

而且

<div class="form-group"> 
     @Html.LabelFor(model => model.CreatedBy, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="form-control-static"> 
      &nbsp;&nbsp; 
      @Html.DisplayFor(m => m.CreatedBy, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.HiddenFor(m => m.CreatedBy) 
      @Html.ValidationMessageFor(model => model.CreatedBy, "", new { @class = "text-danger" }) 
     </div> 
    </div> 
3

檢查可能的身份驗證問題

GetUserName()方法只返回當前已驗證用戶的名稱,因此,如果您還沒有登錄到任何現有的賬戶,這將是空的。

這可以根據應用程序的認證方式(基於表單即認證,Windows等),其可以通常web.config文件的<authentication>部分內可看出變化:

<!-- Forms-based authentication (i.e. default username/password scenario) --> 
<authentication mode="Forms"/> 
<!-- Windows-based authentication (i.e. use current account) --> 
<authentication mode="Windows"/> 

在文件>新建項目場景中,窗體身份驗證很可能會啓用(除非顯式取消選中),所以您應該只需創建一個新帳戶,然後登錄該帳戶即可查看正確顯示的用戶名風景。

考慮交替使用

如果您確信您的身份驗證是不是根本問題,考慮避免HTML輔助方法完全和簡單地使用任何現有的GetUserName()方法或輸出值的隱藏字段在User.Identity.Name屬性,它應該返回相同的值假設你沒有修修補補與索賠:

<div class="form-control-static"> 
    <!-- Either of these approaches should work if you are authenticated --> 
    <input type='hidden' value='@User.Identity.GetUserName()' /> 
    <input type='hidden' value='@User.Identity.Name' /> 
    @Html.ValidationMessageFor(model => model.CreatedBy, "", new { @class = "text-danger" }) 
</div> 

如果一切都失敗...

如果兩個建議的解決方案似乎都無法正常工作,那麼很可能是項目中的某些內容可能沒有正確配置(即內置標識邏輯)。

如果您創建了一個空白項目,然後只是從默認模板中粘貼了一些代碼,而這些代碼的設置不正確,則可能會出現這種情況。

+0

我已登錄,因此它正確地在loginPartial中顯示用戶名。如果我沒有登錄,它不會顯示。我也嘗試過User.Identity.Name,沒有這樣的運氣。 –

+0

IIRC,LoginPartial視圖通常使用'User.Identity.Name',所以應該以某種方式,形狀或形式工作,以便_should_正在工作。您可能需要考慮檢查確切的LoginPartial視圖以確認。此外,你是否嘗試在vew(或相關的控制器動作)中放置一個斷點來查看User.Identity具有的值和它的屬性。 –

+0

它實際上使用GetUserName()方法,這就是我開始意識到該方法的方式。更改HTML不會執行任何操作。我不確定爲什麼它無法獲得當前登錄的用戶。這是使用Google OAuth的表單登錄。 –

0

嘗試@Html.DisplayFor()代替:

@Html.DisplayFor(x=>User.Identity.Name) 

也許

@Html.DisplayFor(x=>User.Identity.GetUserName()) 
+0

這不是我想的那種工作方式。我試過只是爲了看看,但那不行。 –

+0

夠公平的。我不相信從一個版本的ASP.NET MVC到下一個版本的行爲是一致的,並且這對我最近正在編輯的MVC 4應用程序起作用。 – maniak1982