asp.net mvc 4 中同一视图中的多个模型

Multiple models in same view in asp.net mvc 4

我正在使用 asp.net mvc 4 & Entity Framework 6 制作一个网站,用户登录后,table 记录将显示并且用户 ID 将显示为Session。但是当我 运行 登录后,我收到此错误,Object reference not set to an instance of an object. 我制作了一个自定义模型,其中附加了来自单独 EF6 模型的两个 DbSet。我的代码如下,

自定义模型

public class MkistatVsUserLogin
{
    public sample_1 sample_1 { get; set; }  //Login Model
    public IEnumerable<mkistat> mkistats { get; set; }  //Table Model
}

控制器

[HttpPost]
public ActionResult Login(sample_1 id)
{            
    if (ModelState.IsValid)
    {
        var uservar = db.sample_1.Where(a => a.boid.Equals(id.boid)).FirstOrDefault();
        if (uservar != null)
        {
            Session["UserBOID"] = uservar.boid.ToString();
            return RedirectToAction("UserLogin");
        }
    }
    var mkimodel = new MkistatVsUserLogin { mkistats = dsedb.mkistats.ToList() };
    return View(id);
    return View(mkimodel);
}

查看

@model ABCoLtd.Models.MkistatVsUserLogin
@if (Session["UserBOID"] != null)
{
    <li>Welcome, <b>@Session["UserBOID"].ToString()</b></li>
}
<a class="btn btn-default" href="@Url.Action("UserLogout", "Home")">Log Out</a>
@foreach (var item in Model.mkistats)
{    
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.MKISTAT_ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MKISTAT_PHONE_NO)
        </td>
    </tr>
}

我的代码有问题吗?如果是那么请给我一个解决方案。我想要的只是在同一视图中使用这两个模型,其中用户登录模型将在 Session 和 table 模型中使用以列出所有记录。

删除下面的行

return View(id);

并且在您的 return View 行中还提到了 View 或 ActionMethod 名称

return View("ViewName",mkimodel)

在您的操作方法中,使用 Session 传递 ID

Session["UserID"] = id;

您可以在视图中使用与 :

<html>
-----Your CODE
<body>
------Your CODE
    @Session["UserID"]
------Your CODE
</body>
</html>

登录后,您直接将用户重定向到一个您未提及的操作 here.And 您显示其视图的操作是一个强类型视图,需要 MkistatVsUserLogin 列表.但是,我认为您没有传递该列表,因此视图的 Model 属性 将保持为空,这将导致对象引用错误。请检查此问题。

您可以创建一个 ViewModel 来处理:

namespace ABCoLtd.ViewModels
{
  public class LoginVM
  {

     public MkistatVsUserLogin MkistatVsUserLogin {get;set;}
     public int Id {get;set;}
  }
}

实际上是这样传递的:

var mkimodel = new MkistatVsUserLogin { mkistats = dsedb.mkistats.ToList() };
LoginVM vm = new LoginVM();
vm.MkistatVsUserLogin  = mkimodel ;
vm.Id = id;
return View(vm );

并在视图中将模型设置为 LoginVM:

@model ABCoLtd.ViewModels.LoginVM

更新:

你已经有一个视图模型没有注意到,你只需要这样做:

var mkimodel = new MkistatVsUserLogin 
                  { 
                    mkistats = dsedb.mkistats.ToList(),
                    sample_1 = id
                     };
return View(nkimodel);

我明白了。我刚刚在控制器中创建了另一种方法,用于通过用户会话查看 table。

    [HttpPost]
    public ActionResult Login(sample_1 id)
    {            
        if (ModelState.IsValid)
        {
            var uservar = db.sample_1.Where(a => a.boid.Equals(id.boid)).FirstOrDefault();
            if (uservar != null)
            {
                Session["UserBOID"] = uservar.boid.ToString();
                return RedirectToAction("UserLogin");
            }
        }
        return View(id);            
    }

    public ActionResult UserLogin()
    {
        if(Session["UserBOID"] != null)
        {
            var mkimodel = new MkistatVsUserLogin { mkistats = dsedb.mkistats.ToList() };
            return View(mkimodel);
        }
        else
        {
            return RedirectToAction("Login");
        }
    }