gpt4 book ai didi

c# - 家庭 Controller 中每个 mvc actionresult 的代码相同

转载 作者:可可西里 更新时间:2023-11-01 14:52:55 25 4
gpt4 key购买 nike

所以我暂时有一些链接到各种 View 的通用操作结果。布局页面包含对 adfs 的调用以填充必须用于每个页面的登录用户名。看起来像这样:

            <div class="float-right">
<section id="login">
Hello, <span class="username">@ViewBag.GivenName @ViewBag.LastName</span>!
</section>
</div>

在家庭 Controller 中,使这个登录名起作用的是这里的代码:

    public ActionResult Index()
{
ClaimsIdentity claimsIdentity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
Claim claimGivenName = claimsIdentity.FindFirst("http://sts.msft.net/user/FirstName");
Claim claimLastName = claimsIdentity.FindFirst("http://sts.msft.net/user/LastName");

if (claimGivenName == null || claimLastName == null)
{
ViewBag.GivenName = "#FAIL";
}
else
{
ViewBag.GivenName = claimGivenName.Value;
ViewBag.LastName = claimLastName.Value;
}


return View();
}

但如前所述,我需要在用户转到每个链接(actionresult)时显示它。因此,我必须将上面的所有代码发布到每个 actionresult 中才能实现这一点。

有什么方法可以将其作为一个整体应用于每个 actionresult,而不必将代码从一个 Action 复制到另一个 Action ?我确实尝试过为我的 _Layout.cshtml 注册到 actionresult 并调用该部分 View ,但这并没有给我带来有利的结果。我确信我缺少的是简单的东西。

希望你们中的一些人能提供帮助。非常感谢。

最佳答案

我们使用一个抽象 Controller 并覆盖它的 OnActionExecuting 方法以在调用实际操作方法之前执行代码。有了这个抽象 Controller ,你所要做的就是让任何其他 Controller 继承它来获得它的功能。我们还使用这个基本 Controller 作为定义其他扩展它的 Controller 可以使用的其他辅助方法的地方,例如 GetUsernameForAuthenticatedUser()

public abstract class AbstractAuthenticationController : Controller
{
private readonly IAuthenticationService _authService;

protected AbstractAuthenticationController()
{
_authService = AuthenticationServiceFactory.Create();
}

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);

EnsureUserIsAuthenticated();
}

internal void EnsureUserIsAuthenticated()
{
if (!_authService.IsUserAuthenticated())
{
_authService.Login();
}
}

protected string GetUsernameForAuthenticatedUser()
{
var identityName = System.Web.HttpContext.Current.User.Identity.Name;
var username = _authService.GetUsername(identityName);
if (username == null) throw new UsernameNotFoundException("No Username for " + identityName);
return username;
}
}

此功能也可以在 Attribute 类中实现,它允许您装饰 Controller 而不是使用继承,但最终结果是相同的。 Here is an example of a custom controller attribute implementation .

关于c# - 家庭 Controller 中每个 mvc actionresult 的代码相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com