ASP.NET MVC控制器未使用ModelView向PartialView传递正确的值



我正在尝试创建一个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)

最新更新