объект не содержит ошибку определения при доступе к набору данных в представлении MVC - PullRequest
0 голосов
/ 24 ноября 2010

У меня небольшая проблема с получением некоторых данных в моем приложении MVC C #.

В контроллере у меня есть следующее для получения набора данных для использования в представлении.

public ActionResult Franchisee()
    {
        getNav();

        var data = (
                   from f in DietCenterDB.Franchises
                   join fc in DietCenterDB.FranchiseContents on f.ID equals fc.FranchiseId
                   into ffc
                   from subffc in ffc.DefaultIfEmpty()
                   select new { 
                                State = f.State,
                                City = f.City,
                                AccountCode = f.AccountCode,
                                CenterNumber = f.CenterNumber, 
                                FranchiseContentId = (subffc == null ? 0 : subffc.FranchiseContentId) }
                    ).ToList();

        return View(data);
    }

Представление имеет следующий код

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Content.master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<dynamic>>" %>

<asp:Content ID="Head" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

    <h1>Franchisee Administration - <%: Html.ActionLink("Add New", "FranchiseeEdit", new { id = 0 }) %></h1>
    &raquo; <%: Html.ActionLink("Content Management Home", "Index") %>
    <p></p>
    <table cellpadding="0" cellspacing="0" width="600px">
        <%
            int counter = 0;
            string rowClass;

            foreach (var item in Model) {
                if ((counter % 2) == 0)
                {
                    rowClass = "r1";
                }
                else
                {
                    rowClass = "r2";
                }

                string dataString = item.State + " " + item.City + " " + item.AccountCode + " " + item.CenterNumber;

        %>

                <tr class="row <%: rowClass %>">
                    <td>
                         <%: Html.ActionLink(dataString, "FranchiseeEdit", new { id = item.ID, City = item.City, State = item.State, Zip = item.Zip })%>
                    </td>
                    <td align="right">
                         <%: Html.ActionLink("Edit Microsite Content", "MicrositeContentEdit", new { id = item.ID, City = item.City, State = item.State, Zip = item.Zip })%>
                    </td>
                </tr>


            <% counter++; %>
        <% } %>
   </table>


</asp:Content>

Когда я запускаю приложение, я получаю следующую ошибку

«объект» не содержит определения для «состояния»

При отладке отладчик показывает, что данные на самом деле находятся в памяти.

Любые советы или подсказки приветствуются !!!

1 Ответ

1 голос
/ 24 ноября 2010

Я бы сказал, что у вас динамический ViewPage, а не строго типизированный:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<dynamic>>"

Не говорю, что это проблема, но все будет сложно.

ПочемуВы не проецируете свой запрос в ViewModel и привязываетесь к нему:

var data = (
                   from f in DietCenterDB.Franchises
                   join fc in DietCenterDB.FranchiseContents on f.ID equals fc.FranchiseId
                   into ffc
                   from subffc in ffc.DefaultIfEmpty()
                   select new MyViewModel { 
                                State = f.State,
                                City = f.City,
                                AccountCode = f.AccountCode,
                                CenterNumber = f.CenterNumber, 
                                FranchiseContentId = (subffc == null ? 0 : subffc.FranchiseContentId) }
                    ).ToList();

А затем в своем View:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MyViewModel>>"

EDIT

MyViewModel - это простой класс, который вам нужно создать, который обеспечивает легкое хранилище для вашей модели:

public class MyViewModel
{
   public int State {get;set;}
   public int City {get;set;}
   public int AccountCode {get;set;}
   public int CenterNumber {get;set;}
   public int FranchiseContentId {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...