2

以下は私の見解からのコードです。何らかの理由で、モデルのプロパティ(つまり.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?)

ビューのインデックスページのコードは次のとおりです。このページは、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);
4

2 に答える 2

3

問題は、実際のモデルにないプロパティにアクセスしようとしていることです。TableName、IssueType、およびStatusは、リスト自体ではなく、リストの項目の一部です。フォームを投稿するとき、フィルター情報をどのように取得しますか?ドロップダウンは実際にはアイテムの一部ではありませんが、適用したいフィルターの場合です。

すべてのUI情報を処理するようにviewmodelを作成する必要があります。これは実際にアクセスしようとしているものです。

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;}


}

次に、ビューモデルをコントローラーアクションに投稿し、選択に基づいてフィルターを処理します。

そこにいる間、ビューモデルに選択リストを保存することもできます。ビューバッグの代わりに、長期的には少し楽になるでしょう。

于 2013-02-28T17:53:53.230 に答える
1

より良い理解を得るために、より簡単な言葉であなたの状況について考えてください。

オブジェクトのリストがあります。

リスト内の各オブジェクトには、プロパティのコレクションがあります。

public class ModelObject
{
  public string ModelProperty {get; set}
}
var myModels = new List<ModelObject>();

これで、ドット演算子を使用してオブジェクトからプロパティにアクセスできます。これは問題ありません:

 ModelObject.ModelProperty

ただし、リストでドット演算子を使用することはできません。

リストを反復処理するか、ドット演算子を使用してリストのメンバーのプロパティにアクセスする前に、First()またはそのようなものを使用する必要があります。FirstOrDefault()

于 2013-02-28T18:08:04.837 に答える