1

StateId と CityId の代わりに州と都市の名前を表示する方法を見つけようとして、いくつかの問題が発生しています。

State と Cities のインスタンスを次のようにモデルに入れることができることは承知しています。

 public virtual Cities Cities { get; set; }
 public virtual States States { get; set; }

そして、これをビューに追加します:

 @Html.DisplayFor(modelItem => item.Cities.CityName)
 @Html.DisplayFor(modelItem => item.States.StateName)

ただし、エラーなしでこれを行うことができないことがいくつかあります。ビューに必要なものを提供する ViewModel を使用します。Addresses テーブルのリストに依存しており、Addresses モデルにはこれらの選択リストがあり、編集時と作成時にそれぞれのドロップダウン リストを設定できます。これらをモデルに追加して selectLists を削除すると、Column Cities_CityId、States_StateId が見つからないというエラーが表示されます。それをviewModelに追加すると、ビューで使用できなくなります。1つのレコードを表示しているときにのみ必要な場合は、使用できます

Model.Cities.CityName

しかし、私はいくつかのレコードを取得しています.それらが存在し、それを使用すると、すべてのレコードに対して同じ市と州が表示されると思います..

私の結合はすべて正しいと思いますが、何かが欠けている可能性があります。

以下はViewModelです:

public partial class AddressOverview 
{
    public static AddressOverview GetAddressByCompany(int id, GeneralEntities db)
    {
        var qCus = from ad in db.Addresses
                   join cn in db.CompanyNames on ad.CompanyId equals cn.CompanyId
                   join cit in db.Cities on ad.City equals cit.CityId
                   join st in db.States on ad.State equals st.StateId
                   where (ad.CompanyId == id)
                   select new AddressOverview()
                   {
                       AddressId = ad.AddressId,
                       Customer = cn.CompanyName,
                       Location = ad.LocationName,
                       Addresses = ad,
                       CompanyId = ad.CompanyId,
                       State = st.StateName,
                       City = cit.CityName
                   };


        var result = qCus.FirstOrDefault();

        if (result != null)
        {
            result.AddressDetail = db.Addresses.Where(a => a.CompanyId == result.CompanyId);

        };
        return result;
    }

    public int AddressId { get; set; }
    public string Customer { get; set; }
    public string Location { get; set; }
    public int CompanyId { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public virtual Addresses Addresses { get; set; }
    public virtual CompanyNames CompanyName { get; set; }
    public virtual Cities Cities { get; set; }
    public virtual States States { get; set; }
    public virtual IEnumerable<Addresses> AddressDetail { get; set; }
}

そして、ここにコントローラーがあります:

 public ActionResult Index(int id)
    {
        //Trying to get a view model for customer from the received UserId.
        AddressOverview modelInstance = AddressOverview.GetAddressByCompany(id, db);
        
        if (modelInstance == null)
        {
            //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            return RedirectToAction("/Add/", new { id });
        }
        return View(modelInstance);
    }

modelInstance を使用してコントローラーでこれを行う方法があるかどうか疑問に思っていますか? 許してください、私は他の誰かがしたことを片付けようとしていて、私のスキルは少し弱いです。何か他のものを見る必要がある場合は、私に知らせてください。ご協力いただきありがとうございます!

更新: 私は頭の瞬間にピシャリと音を立てました..下に投稿された質問からビューを見ると、ViewModel ではなく Addresses モデルから呼び出していることに気付きました。だから私はそれを修正しましたが、それでも動作しません..これから変更:

@model MyProject.GenerDTO.Entities.Addresses

に:

@model MyProject.Models.AddressOverview

更新:これが私が思いついた解決策です。おそらく最善ではありませんが、確かに迅速な修正..

私は、MSSQL 側でビューを作成し、これらすべてをまとめて、それをビューと ViewModel で使用することにしました。このようなことをすることにした場合。エンティティで [NotMapped] であることを確認してください。これは表示のみに使用しており、編集、作成などに使用するためのものではありません。

新しいビュー モデルは次のとおりです。

public partial class AddressOverview 
{
    public static AddressOverview GetAddressByCompany(int id, GeneralEntities db)
    {
        var qCus = from ad in db.AddressView
                   join cn in db.CompanyNames on ad.CompanyId equals cn.CompanyId
                   where (ad.CompanyId == id)
                   select new AddressOverview()
                   {
                       AddressId = ad.AddressId,
                       Customer = cn.CompanyName,
                       Location = ad.LocationName,
                       AddressView = ad,
                       CompanyId = ad.CompanyId
                       
                   };


        var result = qCus.FirstOrDefault();

        if (result != null)
        {
            result.AddressDetail = db.AddressView.Where(a => a.CompanyId == result.CompanyId);
        };
        return result;
    }

    public int AddressId { get; set; }
    public string Customer { get; set; }
    public string Location { get; set; }
    public int CompanyId { get; set; }
    public virtual AddressView AddressView { get; set; }
    public virtual CompanyNames CompanyName { get; set; }
    public virtual IEnumerable<AddressView> AddressDetail { get; set; }
}

SQL でビューを作成するのはクリーンで、クエリはサーバー側で行われると思います。プロジェクト内のテーブルのように扱うことができます。私は代替案に対してオープンです。

4

0 に答える 0