c# - ASP.NET MVC 动态模型未被识别
问题描述
我正在尝试在 ASP.NET MVC 应用程序的 1 个视图中使用 2 个模型,并尝试使用此处描述的动态模型方法:https ://www.c-sharpcorner.com/UploadFile/ff2f08/multiple-models-在 MVC 中的单一视图/
这是我的控制器:
细节控制器
// GET: Statewides/Details/5
public ActionResult Details(int? id)
{
ViewBag.ID = id;
var today = DateTime.Today;
var todayAsString = today.ToString("MM/dd/yyyy");
ViewBag.Today = todayAsString;
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Statewide statewide = db.Statewides.Find(id);
var document = from s in db.Documents
where s.Statewide_ID == id
select s;
dynamic mymodel = new ExpandoObject();
mymodel.Statewides = statewide;
mymodel.Documents = document;
if (statewide == null)
{
return HttpNotFound();
}
return View(mymodel);
}
这是我观点的一部分:
@model dynamic
@{
ViewBag.Title = "Details";
}
<div class="row">
<div class="col-md-9 text-left">
<h5><strong>COUNTY:</strong> <span class="box-shadow px-3">@Model.Statewide.COUNTY</span></h5>
</div>
<div class="col-md-3 text-right district">
<h5><strong>District:</strong>@Model.Statewide.District</h5>
</div>
</div>
在该页面的底部,我需要访问 Documents 模型:
<table>
<tr>
<th>Doc Type</th>
<th>Order Date</th>
<th>Location</th>
</tr>
@foreach (Document document in Model.Documents)
{
<tr>
<td>@document.Doc_Type</td>
<td>@document.Order_Date</td>
<td>@document.Doc_Location</td>
</tr>
}
</table>
在这里,我收到一条错误Document
消息,提示“找不到类型或命名空间文档”。我不确定我做错了什么,因为在我看来,我做了与指南相同的事情。
如果您需要,这里是完整视图,请注意,我没有更改很多从仅在全州范围内的旧模型中检索值的实例。请忽略那些:
@model dynamic
<!-- CUSTOM CSS -->
<link href="~/Styles/Documents/DetailsStyle.css" type="text/css" rel="stylesheet">
<!-- GOOGLE ICONS -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
@{
ViewBag.Title = "Details";
}
<div class="bigContainer">
<div class="container-fluid text-center topLabel">
<div class="borderline">
<h4 class="title"><strong>DETAIL RECORD - RP ROADWAY HISTORY FILE</strong></h4>
<div class="row">
<div class="col-md-1 printButton">
<input class="text-left" type="button" onclick="javascript:window.print()" value="Print" runat="server" />
</div>
<div class="col-md-11">
<p class="text-right">
<u>Current Date:</u>
<script>document.write(new Date().toLocaleDateString());</script>
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-9 text-left">
<h5><strong>COUNTY:</strong> <span class="box-shadow px-3">@Model.Statewide.COUNTY</span></h5>
</div>
<div class="col-md-3 text-right district">
<h5><strong>District:</strong>@Model.Statewide.District</h5>
</div>
</div>
<div class="row">
<div class="col-md-4 text-left">
<h5><strong>Route No:</strong><span class="box-shadow px-4">@Html.DisplayFor(model => model.RouteNo)</span></h5>
</div>
<div class="col-md-4">
<h5><strong>Sign System:</strong><span class="box-shadow px-4 sign">@Html.DisplayFor(model => model.SignSys)</span></h5>
</div>
<div class="col-md-4"></div>
</div>
<div class="row">
<div class="col-md-12 text-left">
<h5><strong>LocalName:</strong></h5>
</div>
</div>
<div class="row">
<div class="col-md-4 text-left">
<h5 class="box-shadow px-3 localName">@Html.DisplayFor(model => model.LocalName)</h5>
</div>
<div class="col-md-8"></div>
</div>
<div class="row suppMethodDuplicate">
<div class="col-md-2 text-right">
<h5><strong>Supp Des:</strong></h5>
</div>
<div class="col-md-2 text-left">
<h5>@Html.DisplayFor(model => model.SuppDes)</h5>
</div>
<div class="col-md-2 text-right">
<h5><strong>Method:</strong></h5>
</div>
<div class="col-md-2 text-left">
<h5>@Html.DisplayFor(model => model.Method)</h5>
</div>
<div class="col-md-1"></div>
<div class="col-md-2 text-left">
@Html.DisplayFor(model => model.Duplicate_OK)
<label class="form-check-label" for="duplicateCheck"><strong>Duplicate OK</strong></label>
</div>
</div>
<div class="row">
<div class="col-md-2 text-right">
<h5><strong>Date:</strong></h5>
</div>
<div class="col-md-2 text-left">
<h5>@Html.DisplayFor(model => model.ReservedDate)</h5>
</div>
<div class="col-md-2 text-right">
<h5><strong>Original Location:</strong></h5>
</div>
<div class="col-md-2 text-left">
<h5>@Html.DisplayFor(model => model.OriginalL)</h5>
</div>
</div>
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-2 text-right">
<h5><strong>Original D:</strong></h5>
</div>
<div class="col-md-6 text-left">
<h6>@Html.DisplayFor(model => model.OriginalD)</h6>
</div>
</div>
<div class="borderline text-left">
<h5 class="mb-0"><strong>DOCUMENTS</strong></h5>
</div>
<table>
<tr>
<th>Doc Type</th>
<th>Order Date</th>
<th>Location</th>
</tr>
@foreach (Document document in Model.Documents)
{
<tr>
<td>@document.Doc_Type</td>
<td>@document.Order_Date</td>
<td>@document.Doc_Location</td>
</tr>
}
</table>
<div class="borderline text-left">
<h5 class="mb-0"><strong>PROJECTS</strong></h5>
</div>
<h6 class="text-left">@Html.DisplayFor(model => model.Projects)</h6>
<div class="borderline text-left">
<h5 class="mb-0"><strong>COMMENTS</strong></h5>
</div>
<h6 class="text-left">@Html.DisplayFor(model => model.Comments)</h6>
</div>
<p style="margin-top: 20px">
@Html.ActionLink("Back to List", "Index")
</p>
</div>
Serge 建议我使用视图模型,所以我尝试了这个:
视图模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Roadway_History.Models
{
public class ViewModel
{
public Statewide Statwide { get; set; }
public Document Document { get; set; }
}
}
行动
// GET: Statewides/Details/5
public ActionResult Details(int? id)
{
ViewBag.ID = id;
var today = DateTime.Today;
var todayAsString = today.ToString("MM/dd/yyyy");
ViewBag.Today = todayAsString;
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var model = new ViewModel
{
Statewide statewide = db.Statewides.Find(id);
var document = from s in db.Documents
where s.Statewide_ID == id
select s;
};
if (statewide == null)
{
return HttpNotFound();
}
return View(model);
}
但这也行不通。我得到错误
Statewide is a type which is not valid in the given context
和ViewModel does not contain a definition for statewide
我相信行动方法是错误的,但我不知道如何解决它。
此外,@model ViewModel
在视图中使用会出现错误“找不到类型或命名空间 ViewModel”
解决方案
如果您需要为一个视图使用两个模型,您可以创建一个包含它们的视图模型
public class ViewModel
{
public Statewide Statwide {get; set;}
public List<Document> Documents {get; set;}
}
在视图中
@model ViewModel
行动
var model = new ViewModel
{
Statewide= ... your code
Document=... your code
};
......
return View(model);
更新
像这样修复你的视图模型
var statewide = db.Statewides.FirstOrDefault (i=> i.Id==id);
if (statewide == null)
{
return HttpNotFound();
}
var documents = db.Documents.Where(s=> s.Statewide_ID == id).ToList();
if (documents == null)
{
return HttpNotFound();
}
var model = new ViewModel
{
Statewide =statewide,
Documents = documents
};
return View(model);
但您也需要根据新的视图模型修复模型
推荐阅读
- typescript - 打字稿中的视频加载功能引发错误
- ios - 'UITextDocumentProxy.Protocol' 类型的值在强制中不符合 'UIKeyInput'
- r - R,data.table:对名称存储在向量中的所有列求和
- ios - 来自两个文本字段的值被添加到第一个
- xml - 使用 XSLT 从 XML 输出绝对路径和值
- angular - Angular 4:ngDoCheck 与 ngAfterViewChecked 之间的区别
- uuid - 检测虚拟信标设备
- c++ - 如何覆盖 || 在 C++ 中
- python - Python:如何使用 (BeautifulSoup) 访问和迭代 div 类元素列表
- bash - 比较目录和数组之间的文件名