1

ビューバッグを使用して顧客のリストを強く型付けされたビューに戻そうとしていますが、MVC と Razor を初めて使用するため、いくつかの問題があります。次の問題について誰か親切にアドバイスをいただけますか?

コントローラーに次のコードがあります。

  public ViewResult Index()
    {
        var q = from a in db.Customers
        select a;
        ViewBag.customer = q;
        return View(db.CustomerSites.ToList());
    }

そして私の見解ではこのコード

@foreach (var customer in Model)
{
<tr>
 <td>
        @ViewBag.customer.CustomerName
   <td>
   <td>
        @customer.UnitNo
    </td>
    <td>
        @Truncate(customer.StreetName, 25)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=customer.Id }) |
        @Html.ActionLink("Details", "Details", new { id=customer.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=customer.Id })
    </td>
   </tr>
}

顧客と顧客サイトのリストを取得しています。サイトはビューに入力されています。

@model IEnumerable<trsDatabase.Models.CustomerSite>

を使用して顧客のリストから CustomerName を抽出しようとしています

@ViewBag.customer.CustomerName

しかし、これは「顧客」タイプに顧客名の定義が含まれていないというエラーを生成していますが、以下に示すようにエラーが発生している理由がわかりません。

namespace trsDatabase.Models
{
    public class Customer
    {

        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [StringLength(50), Required(ErrorMessage = "Customer name required, please enter a customer name")]
        public string CustomerName { get; set; }
        [DisplayName("Contact Name")]
        [StringLength(50), Required(ErrorMessage = "Primary contact name required, please enter a contact name")]
        public string PrimaryContactName { get; set; }
        [DisplayName("Secondary Contact")]
        public string SecondaryContactName { get; set; }
        [DisplayName("Email")]
        [StringLength(50), Required(ErrorMessage = "Primary email address is required please enter an email address")]
        public string PrimaryEmailAddress { get; set; }
        [DisplayName("Secondary Email")]
        public string SecondaryEmailAddress { get; set; }
        [ScaffoldColumn(false)]
        public DateTime RegisteredDate { get; set; }
        [DisplayName("Contact No")]
        public string PrimaryContactNo { get; set; }
        [DisplayName("Secondary Contact No")]
        public string SecondaryContactNo { get; set; }
        [DisplayName("Waste Carrier Ref")]
        public string WasteCarrierRef { get; set; }
        [DisplayName("Unit No")]
        public string UnitNo { get; set; }
        [DisplayName("Street Name")]
        [StringLength(50), Required(ErrorMessage = "Street name required, please enter a street name ")]
        public string StreetName { get; set; }
        [StringLength(50), Required(ErrorMessage = "Town required, please enter a town")]
        public string Town { get; set; }
        [StringLength(50), Required(ErrorMessage = "County is required, please enter a county")]
        public string County { get; set; }
        [StringLength(10), Required(ErrorMessage = "Postcode is required, please enter a postcode")]
        public string Postcode { get; set; }
        public List<CustomerSite> CustomerSites { get; set; }
    }
}

アップデート:

これで必要なことを実行することはまだできません。次を含むマスタービューモデルを作成しました

public IEnumerable <Customer> SomeCustomer { get; set; }
public IEnumerable <CustomerSite> CustomerSites { get; set; }

それから私の見解では、

@model IEnumerable<trsDatabase.Models.masterViewModel>

for each を使用して入力してモデルにアクセスしようとすると、

@foreach (var customer in Model)

@customer と入力すると。リスト内の個々のプロパティではなく、2 つのリストにのみアクセスできます。

たとえば、@customer.CustomerSites.UnitNoでこれを行うことができたと思いました

しかし、私ができる限りのことは @customer.CustomerSites です。

ここで私が間違っていることについて何か考えはありますか?

4

2 に答える 2

1

これを少し改善できると思います。まず、ViewModel と呼ばれる新しいクラスを作成します。これをモデルフォルダーに追加し、ex. CustomerSitesViewModel.cs

その中に、の定義を追加します

public IEnumerable Customers {get;set;}
public IEnumerable CustomerSites {get;set;}

または、ViewModel CustomerSiteViewModel.cs を作成することもできます。

public Customer CustomerDetails {get;set;}
public CustomerSite CustomerSiteDetails {get;set;}

フィールドに Customer および CustomerSite という名前を付けることもできますが、どちらを呼び出せばよいかわからない再帰ループに陥らないように、デモ目的ではそうしませんでした。

次に、(ビューを表示するための)ビューは

@model CustomerViewViewModel

またはリストが必要な場合

@model IEnumerable

これは、ViewBag データとは対照的に推奨される方法です。強く型付けされています。従いやすく、エラーが発生しにくくなります。

于 2011-05-06T18:53:42.410 に答える
0

q顧客ではなく、一連の顧客です。したがって、 と言うViewBag.customer = q;と、ViewBag.customerプロパティは のタイプIEnumerable<Customer>になり、当然、CustomerNameプロパティはありません。

于 2011-05-06T11:34:59.097 に答える