2017-07-08 3 views
-1

Bonjour Je dispose de fonctionnalités pour enregistrer le texte et l'image des formulaires dans Azure SQL db (texte) et Azure Blobs pour mes images. En outre, il est hébergé dans le cloud dans Azure et la sauvegarde et le téléchargement fonctionnent correctement. Courir sur la pile habituelle C# EF MVC5 Bootstrap Vanilla js et Azure Blobs Webrole etc.Blocs et modèles Azure MVC5

Je suis coincé sur une zone que je n'arrive pas à comprendre - affiche mon modèle de vue (c'est un viewmodel avec deux objets EF deux tables de base de données) avec la liste blob (objet blob Azure). En raison de leur technicité n'est pas le même type de contexte est le problème, mais comment pouvons-nous combiner les deux et la sortie comme suit:

Retour vue (jobsVModel + Blobs);

Voici mon travail actuel: Modèle:

namespace client.Models 
{ 
    public class JoinUsersandJobsModel : DbContext 
    { 


     public tradesusers tradesusers { get; set; } 
     public jobs jobs { get; set; } 
     public uploadedfiles uploadedfiles { get; set; } 
     //add a blob service to our model 
     //public BlobProfileImageServices _blobServices = new BlobProfileImageServices(); 


    } 

} 

Le j'ai mon contrôleur:

private traderEntities db = new traderEntities(); 
BlobProfileImageServices _blobServices = new BlobProfileImageServices(); 
    public ActionResult Index(string usernameCookie) 
     { 


      var viewModel = from u in db.tradesusers 
          join j in db.jobs on u.id equals j.jobbyuserid 
          join pic in db.uploadedfiles on j.id equals pic.ImageId 
          where u.email.Equals(usernameCookie) 
          select new JoinUsersandJobsModel { tradesusers = u, jobs = j, uploadedfiles = pic }; 

      //blob container 
      List<ImageVM> images; 

      CloudBlobContainer blobContainer = _blobServices.GetCloudBlobContainer(); 
      List<string> blobs = new List<string>(); 
      foreach (var blobItem in blobContainer.ListBlobs()) 
      { 
       blobs.Add(blobItem.Uri.ToString()); 

      } 

      images = blobs 
       // convert an Azure blob record into an ImageVM: 
       .Select(b => new ImageVM() 
       { 

       }) 
       .ToList(); 

      //return View(blobs); 


      //return View(imageModel); 

      //List<Object> allS = (from x in viewModel select (Object)x).ToList(); 
      //allS.AddRange((from x in blobs select (Object)x).ToList()); 

      return View(images); 
      //return View(db.tradesusers.ToList()); 
     } 

Comme vous pouvez le voir ci-dessus, je veux revenir les deux objets, l'un qui est appelé 'blobs' et le second appelé 'viewModel' ensemble en même temps à ma vue, mais nous pouvons voir qu'ils sont deux types d'objets différents! 'Return View (viewModel.ToList())' fonctionne seul, tout comme 'Return View (blobs)'.

Mon Vue:

@model IEnumerable<traderclient.Models.JoinUsersandJobsModel> 
<[email protected] List<traderclient.Models.ImageVM>--> 

@{ 
    ViewBag.Title = "Profile"; 
} 

     <!DOCTYPE html> 

     <html> 
     <head> 
      <meta name="viewport" content="width=device-width" /> 
      <title>system - Client's Profile</title> 
     </head> 
     <body> 

      <br /><br /><br /><br /><br /> 
      <h1>Profile</h1> 


       @foreach (var item in Model) 
       { 

        <div> 
         <h5> Profile pic</h5> 



         <hr /> 


         <dl class="dl-horizontal"> 
          <dt> 
           Pic 
          </dt> 

          <dt> 

          </dt> 

          <dd> 

           <img src="@Url.Content(@[email protected])" width="250" height="250" multiple /> 


          </dd> 

         </dl> 
         <p> 
          @Html.ActionLink("Edit", "Edit", new { id = @item }) | 
          @Html.ActionLink("Back to List", "Index") 
         </p> 
        </div>   } 



      <table> 
       <tr> 
        <td> 
         <table class="table" style="width:200px;"> 
          <tr> 
           <td style="width:50%"> Image </td> 
           <td style="width:25%"> Delete </td> 
          </tr> 


          <ul style="list-style-type:none; padding:0;"> 
           @foreach (var item in model2) 
           { 
            <tr> 
             <td> <img src="@item." alt="image here is" width="100" height="100" /> </td> 
             <td> <input type="button" id="@item." onclick="deleteImage('@item');" value="Delete" /></td> 
            </tr> 
           } 
          </ul> 
         </table> 
        </td> 
        <td style="width:100px"></td> 
       </tr> 

      </table> 

Encore une fois ci-dessus dans la vue en utilisant une seule définition du modèle fonctionne de manière à savoir le IEnumerable pour les tables d'emplois ou tradesusers ou si je l'utilise seulement l'objet de la liste pour l'objet image Blob qui fonctionne aussi. Mais comme le contrôleur, je ne peux pas combiner les deux. Comme je l'ai déjà mentionné le reste des données (toutes les données à part le blob) résident tous dans la base de données SQL Azure. Seules les images vivent dans les Blobs Azure.

Ne pas oublier ma définition pour mon Blobs qui réside dans cette racine de projet aussi comme une classe distincte:

Répondre

0

Correction à la fin/solution de contournement fourni. Votre réponse a aidé un peu, mais pas tout à fait assez @Dai

Pour résoudre ce faire: Modèle:

// SQL

modèles

// Nom du fichier: JoinUsersandJobsModel.cs

namespace client.Models 
{ 
    public class JoinUsersandJobsModel : DbContext 
    { 


    public tradesusers tradesusers { get; set; } 
    public jobs jobs { get; set; } 
    public uploadedfiles uploadedfiles { get; set; } 
    //Blob service does not need to be here 


} 

}

// FileModel - c'est un modèle supplémentaire ici pour traiter les données blob

// Nom du fichier: FileListModel.cs

namespace client.Models 
{ 
public class FileListModel 
{ 
public FileListModel(IEnumerable<IListBlobItem> list) 
{ 
if (list != null) 
{ 
Files = new List<FileInfo>(); 
foreach (var item in list) 
{ 
FileInfo info = FileInfo.CreateFromIListBlobItem(item); 
if (info != null) 
{ 
Files.Add(info); 
} 
} 
} 
} 
public List<FileInfo> Files { get; set; } 
} 
public class FileInfo 
{ 
public string FileName { get; set; } 
public string URL { get; set; } 
public long Size { get; set; } 

public static FileInfo CreateFromIListBlobItem(IListBlobItem item) 
{ 
if (item is CloudBlockBlob) 
{ 
var blob = (CloudBlockBlob)item; 
return new FileInfo { FileName = blob.Name, 
URL = blob.Uri.ToString(), 
Size = blob.Properties.Length }; 
} 
return null; 
} 
} 
} 

// Controller pour Azure SQL

private traderEntities db = new traderEntities(); 
BlobProfileImageServices _blobServices = new BlobProfileImageServices(); 
    public ActionResult Index(string usernameCookie) 
     { 

      var viewModel = from u in db.tradesusers 
          join j in db.jobs on u.id equals j.jobbyuserid 
          where u.email.Equals(usernameCookie) 
          select new JoinUsersandJobsModel { tradesusers = u, jobs = j, uploadedfiles = pic }; 

      return View(viewModel); 

     } 

// Controller pour Azure Blobs

// Fin en jetant un retour partiel et retour blobs de même type d'action

// et des blobs (modèle Blobs)

// Nous intégrons plus tard, la partie dans le client

public ActionResult loadMyBlob() 
    { 
    CloudBlobContainer blobContainer = _blobServices.GetCloudBlobContainer(); 
       List<string> blobs = new List<string>(); 
       foreach (var blobItem in blobContainer.ListBlobs()) 
       { 
        blobs.Add(blobItem.Uri.ToString()); 

       } 

    return PartialView("loadMyBlob", blobs); 

    } 

// Conception notre partielle fortement typées et ref notre modèle pour blobs

@model yourApp.Models.FileListModel 
@{ 
ViewBag.Title = "File List"; 
} 
<h2>File List</h2> 

<ul> 
@foreach (var item in Model.Files) 
{ 
<li> 
<a href="@item.URL">@item.FileName</a> (@item.Size bytes) 
</li> 
} 
</ul> 
@Html.ActionLink("Upload Another File", "UploadFile") 

// Enfin embed notre partielle dans la vue de l'action - « Index » dans notre cas

// Le code embed peut être placé n'importe où dans votre vue

// action sera exécutée sur demande blob tiré à travers

<embed src='@Url.Action("loadMyBlob", "Profile")'> 

Si quelqu'un a besoin d'aide sur une configuration similaire s'il vous plaît faites le moi savoir.

: Réfs AUSSI accessoires et merci à John Ciliberti où je copiais son idée de son livre pour la classe FileListModel et comment l'afficher dans la vue.

1

Vous ne devez pas utiliser vos objets internes (que ce soit Microsoft.WindowsAzure.Storage.* objets) ou vos propres entités de base de données) comme ViewModels - vous devez créer de nouvelles classes ViewModel pour chaque composant de vue logique (vue, partiel, élément répété, etc.) et les remplir dans vos actions Controller avec les données de vos objets internes.

Par exemple, si vous avez une vue qui affiche une liste d'images, il serait alors comme ceci:

class ImagesController : Controller { 

    public ActionResult Index() { 

     List<ImageVM> images; 
     if(useAzure) { 

      List<CloudStorageBlob> blobs = GetBlobs(...); 
      images = blobs 
       // convert an Azure blob record into an ImageVM: 
       .Select(b => new ImageVM() 
       { 
        Url = b.BlobUrl 
       }) 
       .ToList(); 
     } 
     else { // use local SQL 

      List<MyImageEntity> dbImages = GetImagesFromDB(...); 
      images = dbImages 
       // convert a database MyImageEntity into an ImageVM: 
       .Select(i => new ImageVM() 
       { 
        Url = i.ImageAddress 
       }) 
       .ToList(); 
     } 

     return this.View(images); 
    } 
} 

ViewModels:

public class ImageVM { 
    public String Url { get; set; } 
    public String TitleText { get; set; } 
    public String Etc { get; set; } 
} 

Vue:

@model List<ImageVM> 

<ul> 
@foreach(ImageVM image in this.Model) { 
    <li><img src="@image.Url" title="@image.TitleText" /></li> 
} 
</ul> 
+0

Merci Dai. Votre réponse combine-t-elle mon objet SQL et mon objet Blob? Je pense qu'il se concentre uniquement sur les images blobs mais pas sur mon objet SQL. Comme je l'ai mentionné, mes données textuelles résident dans la base de données SQL Azure qui est séparée de l'endroit où mes données d'image se trouvent dans les blobs Azure. Je veux combiner les deux dans un modèle ou un contrôleur, et les produire ensemble sur une vue. J'ai ajouté un échantillon de code pour vous aider. –

+0

@jamawa Si vous posez cette question, cela signifie que vous n'avez pas lu ma réponse ou que vous ne la comprenez pas. – Dai

+0

Doit être le dernier. Essayons encore une fois, donc ce que vous dites est d'avoir un contrôleur séparé avec son propre modèle et vue? Si c'est le cas, n'aurai-je pas deux vues séparées? Si c'est le cas, est-ce que cela répond à ma question d'avoir une View avec deux modèles composés d'une partie Azure Sql db et d'une partie Azure blob? S'il vous plaît élaborer en donnant un exemple complet des deux modèles mis en œuvre. –