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");
}
}
我正在使用 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");
}
}