以下是我的视图中的代码。无论出于何种原因,模型属性(即.TableName
)都不会被识别出来。以下是错误消息:
CS1061: 'PagedList.IPagedList<Monet.Models.FollowUpItems>' does not contain a definition for 'TableName' and no extension method 'TableName' accepting a first argument of type 'PagedList.IPagedList<Monet.Models.FollowUpItems>' could be found (are you missing a using directive or an assembly reference?)
以下是View的Index页面中的代码。需要此页面来返回SQL表FollowUpItems
中的项目列表:
@model PagedList.IPagedList<Monet.Models.FollowUpItems>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using PagedList.Mvc;
@using PagedList;
<h2>Follow Up Items</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<span id="searchBox" class="boxMe" >
<form method="post">
@Html.DropDownListFor(model => model.TableName, (SelectList)ViewBag.tableID)
@Html.DropDownListFor(m => m.IssueType, (SelectList)ViewBag.issueID)
@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.statusID)
<input type="image" src="@Url.Content("~/Content/Images/Filter.bmp")" alt="Filter" style="padding-top: 0px;" />
<a href="#" style="padding-left: 30px;"></a>
</form>
</span>
<br />
<br />
<span id="programExplanation" style="width: 500px; float:left; padding: 5px; margin-left: 25px;"></span>
<span class="error" style="clear: both;">
@ViewBag.ErrorMessage
</span>
<span class="msg">
@ViewBag.Message
</span>
<br />
<br />
<br />
}
有问题的下拉列表用作原始项目列表的排序条件。可选择的下拉项目不会反映在数据库中,但是每个表示的特定属性都存在。这里有一个好的衡量标准是FollowUpItems
模型
public partial class FollowUpItems
{
public int Id { get; set; }
public string TableName { get; set; }
public string IssueType { get; set; }
public string Status { get; set; }
public string Message { get; set; }
public string CreatedBy { get; set; }
public System.DateTime CreatedOn { get; set; }
public string LastUpdateBy { get; set; }
public Nullable<System.DateTime> LastUpdateOn { get; set; }
public string Key1 { get; set; }
public string Key2 { get; set; }
public string Notes { get; set; }
}
以下是来自控制器的代码:
//Sort info
string table = String.IsNullOrWhiteSpace(dropDownSelection["Table"]) ? "%" : dropDownSelection["Table"];
string issue = String.IsNullOrWhiteSpace(dropDownSelection["IssueType"]) ? "%" : dropDownSelection["IssueType"];
string status = String.IsNullOrWhiteSpace(dropDownSelection["Status"]) ? "%" : dropDownSelection["Status"];
//Set dropdown list items based on previous values
var tableOptions = new[] { new { Text = "--Table Name--", Value = "%" }, new { Text = "CE", Value = "AgentContEd" }, new { Text = "AgentProductTraining", Value = "C" } };
var issueOptions = new[] { new { Text = "--Issue Type--", Value = "%" }, new { Text = "Warning", Value = "W" }, new { Text = "Error", Value = "E" } };
var statusOptions = new[] { new { Text = "--Status Type--", Value = "%" }, new { Text = "Open", Value = "O" }, new { Text = "Under Review", Value = "U" } };
ViewBag.tableID = new SelectList(tableOptions, "Value", "Text", table);
ViewBag.issueID = new SelectList(issueOptions, "Value", "Text", issue);
ViewBag.statusID = new SelectList(statusOptions, "Value", "Text", status);
答案 0 :(得分:3)
您的问题是您正在尝试访问不在您的实际模型中的属性。 TableName,IssueType和Status是列表中项目的一部分,而不是列表本身。发布表单时,如何检索过滤器信息?下拉菜单实际上不是您的项目的一部分,但对于您想要应用的过滤器。
您应该使viewmodel处理所有UI信息 - 这实际上是您尝试访问的信息。
public class YourViewModel
{
public PagedList.IPagedList<Monet.Models.FollowUpItems> itemList {get;set;}
public string TableName {get;set;}
public string IssueType {get;set;}
public string Status {get;set;}
}
然后,您将viewmodel发布到控制器操作,并根据选择处理过滤器。
当你在那里时,你也可以在视图模型中保存你的选择列表,而不是视图包,从长远来看它可能会让生活变得更轻松。
答案 1 :(得分:1)
以更简单的术语考虑您的情况,以便更好地理解。
您有一个对象列表。
列表中的每个对象都有一组属性。
public class ModelObject
{
public string ModelProperty {get; set}
}
var myModels = new List<ModelObject>();
现在,您可以使用点运算符访问对象的属性。这没问题:
ModelObject.ModelProperty
但是你不能在列表上使用点运算符。
您需要迭代列表,或使用First()
或FirstOrDefault()
之类的内容,然后才能访问列表中成员的属性通过点运算符。