2017-02-17 165 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