将对象传递给mvc 5中的布局

时间:2015-04-19 12:25:20

标签: asp.net asp.net-mvc asp.net-mvc-5

我正在从控制器向对象传递对象,如下所示:

public ActionResult MyProfile()
{
  var roles = new List<int?>();
  User.Roles.ForEach(r => roles.Add(r.ID));
  return View(new ProfileModel()
  {
    LoginUser = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string.IsNullOrEmpty(User.LastName) ? string.Empty : User.LastName.ToLower()),
    UserRole = new List<int?>(roles)
  });
}

public class ModelBase {

    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string LoginUser { get; set; }

    public List<int?> UserRole { get; set; }

    public ModelBase() {
        UserRole = new List<int?>();
    }
}

 public class ProfileModel : ModelBase { }

这样可行但是,我必须在返回视图时为我的所有Controller Action执行此操作,因为我需要所有视图上的角色和登录用户。

有没有办法让我这样做一次,而不必在我的行动中重复它?

我尝试将其添加到基本控制器,但ROLES和LOGINUSER始终为null。

我知道在SO上已经解决了很多问题,但他们都在做些什么。

感谢。

3 个答案:

答案 0 :(得分:3)

使用Stephen Muecke的建议我这样做了:

 [ChildActionOnly]
    public PartialViewResult Navigation() {
        return PartialView("_Navigation", new LayoutModel(User));
    }

    [ChildActionOnly]
    public PartialViewResult LoginInfo() {
        return PartialView("_LoginInfo", new LoginInfoModel(User));
    }

并且

<div class="collapse navbar-collapse" id="navbar-collapse-area">
        @Html.Action("LoginInfo", "Home")
</div>

 <div class="col-lg-2 sidebox">
        <div class="sidebar content-box" style="display: block;">
            @Html.Action("Navigation", "Home")
        </div>
 </div>
伯纳德的建议也有效,但我更喜欢这个。

答案 1 :(得分:1)

试试这个:

public ActionResult MyProfile()
{
    var roles = new List<int?>();
    User.Roles.ForEach(r => roles.Add(r.ID));
    return View(new ProfileModel(User));
}

型号:

public class ModelBase 
{
    public ModelBase(User user) {
        UserRole = new List<int?>();
        LoginUser =  CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string.IsNullOrEmpty(user.LastName) ? string.Empty : user.LastName.ToLower()),
    }

    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string LoginUser { get; set; }

    public List<int?> UserRole { get; set; }
}

ProfileModel:

public class ProfileModel : ModelBase 
{ 
    public ProfileModel(User user) : base(user) { }
}

答案 2 :(得分:0)

我认为在你的布局中编写一些代码并不是一个坏习惯。如果它是剃刀视图或类似的东西,您可以直接在视图中添加用户名及其角色。