我正在尝试学习MVC并想出一个小项目来解决它。 我有两个模型:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace reqcoll.Models
{
public class Project
{
[Key]
public int ProjectID { get; set; }
[Required]
[DataType(DataType.Text)]
[MaxLength(150, ErrorMessage = "The project name cannot be longer than 150 characters!")]
[Display(Name = "Project name:")]
public string projectName { get; set; }
[Required]
[Display(Name = "Project type:")]
public ProjectType projectType { get; set; }
public int RequirementID { get; set; }
public virtual List<Requirement> Requirements { get; set; }
}
}
和
using System.ComponentModel.DataAnnotations;
namespace reqcoll.Models
{
public class Requirement
{
[Key]
public int requirementID { get; set; }
[DataType(DataType.Text)]
[MaxLength(150, ErrorMessage = "This is a short description, it cannot be longer than 150 characters.")]
[Required]
public string shortDesc { get; set; }
[DataType(DataType.Text)]
[MaxLength(3999, ErrorMessage = "This is a short description, it cannot be longer than 150 characters.")]
[Required]
public string longDesc { get; set; }
[Required]
public int priorityCode { get; set; }
[Required]
public int OrderID { get; set; }
public int projectID { get; set; }
}
}
我有一个观点:
@using reqcoll.Models;
@model Tuple<Project, IEnumerable<Requirement> >
@{
ViewBag.Title = "ReqColl - project";
}
<div class="top-spacing col-md-12 col-lg-12 col-sm-12">
<div class=" well">
@Html.ValidationSummary(true)
<div class="row">
@Html.LabelFor(tuple => tuple.Item1.projectName, htmlAttributes: new { @class = "control-label col-md-2 col-lg-2 col-sm-12" })
<div class="col-md-10 col-lg-10 col-sm-12">
@Html.TextBoxFor(tuple => tuple.Item1.projectName, htmlAttributes: new { @class = "ProjectNameInput" })
@Html.ValidationMessageFor(tuple => tuple.Item1.projectName)
</div>
</div>
@Html.ValidationSummary(true)
<div class="row row-spacing">
@Html.LabelFor(tuple => tuple.Item1.projectType, htmlAttributes: new { @class = "control-label col-md-2 col-lg-2 col-sm-12" })
<div class="col-md-10 col-lg-10 col-sm-12">
@Html.DropDownListFor(tuple => tuple.Item1.projectType, new SelectList(
new List<Object>{
new { value = 0 , text = "...Select..." },
new { value = 1 , text = "Windows application" },
new { value = 2 , text = "Web application" },
new { value = 3 , text = "Device application"}
},
"value",
"text",
0), htmlAttributes: new { @class = "DropDownList" })
@Html.ValidationMessageFor(tuple => tuple.Item1.projectType)
</div>
</div>
</div>
</div>
<div class="top-spacing col-md-6 col-lg-6 col-sm-12">
<div class=" well">
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(tuple => tuple.Item2.shortDesc)
</th>
<th></th>
</tr>
@foreach (Requirement item in (IEnumerable<Requirement>)Model.Item2)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.shortDesc)
</td>
<td>
@Html.ActionLink("E", "Edit", new { id = item.requirementID }) |
@Html.ActionLink("D", "Delete", new { id = item.requirementID })
</td>
</tr>
}
</table>
</div>
</div>
<div class="top-spacing col-md-6 col-lg-6 col-sm-12">
<div class=" well">
</div>
</div>
当我运行网站时,出现错误:
CS1061:'IEnumerable'不包含'shortDesc'的定义,并且没有可以找到接受类型'IEnumerable'的第一个参数的扩展方法'shortDesc'(你是否缺少using指令或汇编引用?)< / p>
错误出现在“@ Html.DisplayNameFor(tuple =&gt; tuple.Item2.shortDesc)”
行的视图中由于某种原因,它没有在Item2中看到属性“shortDesc”。 我无法弄清楚为什么不。
感谢任何帮助。
答案 0 :(得分:1)
您遇到的问题是tuple.Item2是一个集合,因此您声明时没有tuple.Item2.shortDesc。
您需要执行以下操作:
@Html.DisplayFor(tuple => tuple.Item2)
然后,您将需要一个显示模板,该模板将知道传入的集合要呈现的内容。
之前已经提出过这个问题,这将引导您走上正确的道路:
答案 1 :(得分:0)
Item2
属性指向IEnumerable<Requirement>
,如模型中所示
@model Tuple<Project, IEnumerable<Requirement>>
我可以看到您已在此代码中枚举Item2
@foreach (Requirement item in (IEnumerable<Requirement>)Model.Item2)
您已经调用了item.shortDesc。这是重复的电话吗?