我正在尝试创建一个CustomMembershipProvider。当用户单击登录时,我希望在Shared/_layout.cshtml 中包含的PartialView中显示"welcomeUserName!"
这是控制器类:
[ChildActionOnly]
public ActionResult WelcomeMessage()
{
var userName = this.HttpContext.Session["LoggedInUser"];
WelcomeViewModel wView = new WelcomeViewModel();
if (userName != null)
{
User user = this.db.Users.FirstOrDefault(x => x.UserName == userName);
wView.userId = user.Id;
wView.Message = user.UserName;
}
return PartialView(wView);
}
这是PartialView代码:
@model MvcApplication1.ViewModels.WelcomeViewModel
@Html.ActionLink("Welcome " + Model.Message + "!", "Edit", "Account", new { id = Model.userId })
我可以正确地渲染视图,但是当我单击超链接时,我会出现以下错误:
参数字典包含"MvcApplication1.Controllers.AccountController"中方法"System.Web.Mvc.ViewResult Details(Int32)"的不可为null类型"System.Int32"的参数"id"的null条目。可选参数必须是引用类型、可为null的类型,或声明为可选参数。
似乎使用id=null调用了Edit Action,但是用户名显示正确。我最初使用ViewBag,并根据此处的SO解决方案切换到ViewModel。提前谢谢。
尝试使用此
@Html.ActionLink("Welcome " + Model.Message + "!", "Edit", "Account", new { id = Model.userId }, null)
问题是您设置了ActionLink方法的htmlAttributes参数。
您遇到了错误的@Html.ActionLink
过载,您需要这个
Html.ActionLink("Welcome " + Model.Message + "!", // Display text
"Edit", // ActionMethod
"Acount", // Controller Name.
new { Model.Id }, // Route arguments.
null // htmlArguments
)
基本上,您需要传递htmlAttributes
参数才能达到正确的过载,如果不需要设置任何过载,您可以将其作为null
传递。
看起来你使用了错误的过载,试试看:
@Html.ActionLink("Welcome " + Model.Message + "!", "Edit", "Account",
new { id = Model.userId },
null)