2016-04-26 66 views
1

如果在單個視圖中有兩個模型的視圖中存在條件,我有問題如何以及在哪裏添加。2個模型在單個視圖中,如果條件爲

這是視圖

@foreach (service_provider SP in ViewBag.service_provider) { 
    <tr> 
     <td>@SP.Sp_email</td> 
     <td>@SP.Sp_name</td> 
     <td>@SP.city.Cityname</td> 
    </tr>}@foreach (picture img in ViewBag.pictures){ 
    <tr> 
     <td><img src="data:image/png;base64,@Convert.ToBase64String(img.pic,0,img.pic.Length)" width="100" /> 
     </td> 
    </tr> 
} 

這是圖像模型

public int PIC_ID { get; set; } 
public string pic_name { get; set; } 
public Nullable<int> belong_id { get; set; } 
public byte[] pic { get; set; } 

這是SERVICE_PROVIDER模型

public int SPID { get; set; } 
public string Sp_email { get; set; } 
public string Sp_password { get; set; } 
public string Sp_name { get; set; } 

這是我的控制器

public ActionResult Index(){ 
    ViewBag.service_provider = dc.service_provider; 
    ViewBag.pictures = dc.pictures; 
    return View(); 
} 

上述視圖的目的是顯示service_provider的詳細信息及其圖片,其中belongs_id中的圖片等於SPID in service_provider。但我不明白我在哪裏,如果添加使用數據庫第一種方法condition.I'm

+0

您應該創建與財產封裝服務供應商的圖片的視圖模型(S )。 – Crowcoder

+0

爲什麼不讓一個模型從另一個模型繼承? – Auguste

+0

在完全不相關的說明中,通常不好的做法是將文件存儲在要從網頁再次顯示的數據庫中。這會在客戶端和服務器以及數據庫IO之間生成大量的網絡IO。主要是因爲客戶端不會緩存結果,Web服務器也不能有效地返回文件。更好的方法包括將文件保留在磁盤上,仍然可以從包含文件路徑的數據庫訪問客戶端,或者根據每個映像的靜態url在您的站點中編寫文件處理程序,以便Web客戶端仍可以緩存。 – Igor

回答

0

嘗試:

@foreach (picture img in ViewBag.pictures) 
{ 
    if(img.PIC_ID == ViewBag.service_provider.SPID) 
{ 
<tr><td><img src="data:image/png;base64,@Convert.ToBase64String(img.pic,0,img.pic.Length)" width="100" /></td></tr> 
} 
} 

BTW - 也許更好的方式 - 就是在檢查服務器端和僅返回圖片你需要??

+0

已發生Microsoft.CSharp.RuntimeBinder.RuntimeBinderException – Oshink

4

如果您使用強類型模型而不是ViewBag,將會容易得多。然後,您可以將邏輯添加到您的模型或控制器。我個人更容易閱讀和測試。它還可以防止語法錯誤。

Models.cs

public class Picture { 
    public int PIC_ID { get; set; } 
    public string pic_name { get; set; } 
    public Nullable<int> belong_id { get; set; } 
    public byte[] pic { get; set; } 

    // added - your FK pointing back to the corresponding service_provider 
    public int SPID { get; set; } 
    // added - the corresponding service_provider 
    public service_provider ServiceProvider { get; set; } 
} 

public class service_provider { 
    public int SPID { get; set; } 
    public string Sp_email { get; set; } 
    public string Sp_password { get; set; } 
    public string Sp_name { get; set; } 

    // added 
    public ICollection<Picture> Pictures {get;set;} 
} 

Controller.cs

public ActionResult Index(){ 
    var service_provider = dc.service_provider.Inculde(x => x.Pictures); 
    // var pictures = dc.pictures; 

    // code to add the pictures to the correct service_provider instance 
    // ideally this should already be reflected in your model. 
    // If you are using EF you should be modeling this using proper data relations 
    // that would allow you to execute an .Include statement on the retrieval 
    // and pass the model directly into the View without the need for an additional call to pictures as the service_provider would then already contain the relations 
    return View(service_provider); 
} 

View.cshtml

@model IEnumerable<service_provider> 
@*This following line indicates that it is a list of service_provider hense the IEnumerable*@ 
@foreach (service_provider SP in Model){ 
    <tr> 
     <td>@SP.Sp_email</td> 
     <td>@SP.Sp_name</td> 
     <td>@SP.city.Cityname</td> 
    </tr> 
    @*Iterate over the pictures on each model. 
    You can still split this if you want all service providers and then all pictures.*@ 
    @foreach (picture img in SP.Pictures){ @*changed to still look at the model*@ 
     <tr><td><img src="data:image/png;base64,@Convert.ToBase64String(img.pic,0,img.pic.Length)" width="100" /></td></tr> 
    } 
} 
+0

我遵循數據庫第一種方法。我可以應用Viewmodel嗎? – Oshink

+0

@Oshink - 這是兩個不同的概念。數據庫首先是針對實體框架,ViewModel是針對MVC的。但是,您可以在實體框架中創建模型(首先使用代碼優先或數據庫優先),然後將該模型傳遞給MVC代碼中的強類型視圖。 – Igor

+1

這很接近,但是,您應該可以將其作爲您的控制器:'var service_provider = dc.service_provider.Include(sp => sp.Pictures);返回View(service_provider);'。當然,這裏假設你在創建模型時有外鍵約束,在這種情況下圖片導航屬性會自動爲你創建,否則你自己手動添加導航屬性。 –

相關問題