2010-08-23 4 views
0

Comment déboguer du code dans l'application View in asp.net mvc2?Débogage du code dans une vue (asp.net mvc2)

Modifier après des progrès hier soir:

Ok, donc maintenant je donne les résultats suivants:

dans Shared\EditorTemplates\Equipment.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DAT.Models.Item>" %> 

    <% using (Html.BeginForm()) {%> 
     <%: Html.ValidationSummary(true) %> 

     <div class="editor-label"> 
      <%: Html.Label("Item ID") %> 
      <%: Html.TextBoxFor(model => model.ItemID) %> 
      <%: Html.ValidationMessageFor(model => model.ItemID) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.ModelID) %> 
      <%: Html.DropDownListFor(x => x.Model.Model1, new SelectList(Model.Model.Model1, "ModelId", "Model", Model.ModelID)) %> 
      <%: Html.ValidationMessageFor(model => model.ModelID) %> 
     </div> 

     ... 

dans Item\Edit.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DAT.ViewModels.ItemEditViewModel>" %> 

    <% using (Html.BeginForm()) {%> 
      <%: Html.ValidationSummary(true) %> 

      <fieldset> 
       <legend>Fields</legend> 
        <%: Html.EditorFor(model => model.Item) %> 
       <p> 
        <input type="submit" value="Save" /> 
       </p> 
      </fieldset> 

Le controlle r:

public ActionResult Edit(int id) 
    { 
     var models = from p in database.Models.Where(x => x.Model1 != null) select p; 

     var viewModel = new ViewModel 
          { 
           Things = database.Things.Single(a => a.ItemID == id), 

           //tried this: 
           //Models = database.Models     

           Models = models 
          }; 

     return View(viewModel); 
    } 

Je suis sûr que le problème est avec cette ligne

<%: Html.DropDownListFor(x => x.Model.Model1, new SelectList(Model.Model.Model1, "ModelId", "Model", Model.ModelID)) %> 

Lors de la génération du SelectList, je n'ai pas IEnumerable pour le premier paramètre? Ou l'une des valeurs que je nourris cela cause null. Comment puis-je obtenir la liste des modèles selon moi?

EDIT APRÈS TOUS MES CHEVEUX TIRER OUT:

Il semble que le problème réside dans cet exemple: http://www.asp.net/mvc/tutorials/mvc-music-store-part-4. Bizarrement, je ne suis pas sûr que ce soit conforme aux meilleures pratiques. Regardez le code et comment ils passent les modèles - il semble bêtement obscur en utilisant ViewData ["Blah"] et les modèles aussi, pourquoi ne pouvez-vous pas tout avoir envoyé comme le modèle? Regardez le code comment ils l'ont fait:

Album.ascx:

<%@ Import Namespace="MvcMusicStore"%> 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMusicStore.Models.Album>" %> 

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script> 

<p> 
    <%: Html.LabelFor(model => model.Title)%> 
    <%: Html.TextBoxFor(model => model.Title)%> 
    <%: Html.ValidationMessageFor(model => model.Title)%> 
</p> 
<p> 
    <%: Html.LabelFor(model => model.Price)%> 
    <%: Html.TextBoxFor(model => model.Price)%> 
    <%: Html.ValidationMessageFor(model => model.Price)%> 
</p> 
<p> 
    <%: Html.LabelFor(model => model.AlbumArtUrl)%> 
    <%: Html.TextBoxFor(model => model.AlbumArtUrl)%> 
    <%: Html.ValidationMessageFor(model => model.AlbumArtUrl)%> 
</p> 
<p> 
    <%: Html.LabelFor(model => model.Artist)%> 
    <%: Html.DropDownList("ArtistId", new SelectList(ViewData["Artists"] as IEnumerable, "ArtistId", "Name", Model.ArtistId))%> 
</p> 
<p> 
    <%: Html.LabelFor(model => model.Genre)%> 
    <%: Html.DropDownList("GenreId", new SelectList(ViewData["Genres"] as IEnumerable, "GenreId", "Name", Model.GenreId))%> 
</p> 

Vue:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcMusicStore.ViewModels.StoreManagerViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Edit - <%: Model.Album.Title %> 
</asp:Content> 

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

    <h2>Edit Album</h2> 

    <% Html.EnableClientValidation(); %> 

    <% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Edit Album</legend> 
     <%: Html.EditorFor(model => model.Album, new { Artists = Model.Artists, Genres = Model.Genres}) %> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

    <% } %> 

    <div> 
     <%:Html.ActionLink("Back to Albums", "Index") %> 
    </div> 

</asp:Content> 

Voir Modèle:

using System.Collections.Generic; 
using MvcMusicStore.Models; 

namespace MvcMusicStore.ViewModels 
{ 
    public class StoreManagerViewModel 
    { 
     public Album Album { get; set; } 
     public List<Artist> Artists { get; set; } 
     public List<Genre> Genres { get; set; } 
    } 
} 

Et le contrôleur:

// 
// GET: /StoreManager/Edit/5 

public ActionResult Edit(int id) 
{ 
    var viewModel = new StoreManagerViewModel 
    { 
     Album = storeDB.Albums.Single(a => a.AlbumId == id), 
     Genres = storeDB.Genres.ToList(), 
     Artists = storeDB.Artists.ToList() 
    }; 

    return View(viewModel); 
} 

Il me semble que le modèle est construit dans le contrôleur comme est logique pour moi. Puis dans la vue qu'ils utilisent cette déclaration qui provoque ma confusion:

<%: Html.EditorFor(model => model.Album, new { Artists = Model.Artists, Genres = Model.Genres}) %>

Le modèle est divisé/changé et maintenant nous envoyons les autres (Artistes, Genres) comme ViewData ?? Quelqu'un peut-il expliquer, et est-ce que cela correspond bien à l'ensemble du modèle de conception?

+0

Pouvez-vous nous montrer la méthode d'action dans votre contrôleur? –

+0

Il semble que ViewData ["Models"] est null ici. –

Répondre

3

Vous pouvez mettre un point d'arrêt dans l'action de votre contrôleur et analyser votre modèle et afficher les données. Cela étant dit, pourquoi utilisez-vous une vue fortement typée et ViewData en même temps?Assurez-vous que ViewData["Models"] as IEnumerable n'est pas nul (dans votre contrôleur) ou encore mieux s'en débarrasser et le mettre dans votre modèle comme une propriété fortement typée. Aussi, je vous recommande d'utiliser l'aide fortement typée DropDownListFor:

<%: Html.DropDownListFor(
    x => x.ModelID, 
    new SelectList(Model.Models, "ModelId", "Model", Model.ModelID) 
)%> 
+0

Je suis l'exemple ici où l'exemple de code a montré pour faire cela http://www.asp.net/mvc/tutorials/mvc-music-store-part-4. En ce qui concerne la définition d'un point d'arrêt dans le contrôleur, j'ai fait, AFAICT Je ne transmets aucune valeur nulle. – baron

+0

Vous ne transmettez aucune valeur null ... mais 'ViewData [" Models "] comme IEnumerable' pourrait être une conversion invalide et retourner une valeur nulle. – Charlino

Questions connexes