2012-04-30 12 views
0

D'accord, j'ai un blog qui fonctionne à moitié et j'essaie d'obtenir des commentaires totalement fonctionnels. En ce moment j'ai tous les messages montrant correctement avec tous les commentaires correspondants avec eux. Le seul problème avec ceci est que vous ne pouvez pas réellement ajouter un commentaire à travers le site (je viens de le faire manuellement).Obtenir Create pour travailler dans un ViewModel?

J'ai déjà fait des méthodes "Create" dans mes Controllers, mais seulement par échafaudage automatique.

En ce moment je passe un ViewModel à la page comme suit (ce qui saisit les sujets et commentaires associés au blogpost lui-même.

public ActionResult Post(int id) 
{ 
    var post = (from p in db.Set<BlogPost>() 
       where p.id == id 
       select new PostViewModel 
          { 
           Id = p.id, 
           Title = p.Title, 
           DateCreated = p.DateCreated, 
           Content = p.Content, 
           Topics = p.Topics, 
           Comments = p.Comments, 
           CommentCount = p.Comments.Count 
          }).Single(); 

    return View(post); 
} 

J'ai ce que mon Post.cshtml ...

<div class="blogpost"> 
    <h2>@Model.Title</h2> 
    <div class="post_info">@Model.DateCreated<span class="right">Blog</span></div> 
    <p>@Html.Raw(Model.Content)</p> 
    <div class="post_close"> 
     <span class="left"> 
      @foreach (var topic in Model.Topics) 
      { 
       <text>@Html.DisplayFor(modelItem => topic.Name) </text> 
      } 
     </span> 
     <span class="right"> 
      <img src="../../Content/images/comment.jpg" alt="" /> 
      @if (Model.CommentCount > 1 || Model.CommentCount == 0) 
      { 
       @Model.CommentCount <text>comments</text> } 
      else 
      { 
       @Model.CommentCount <text>comment</text> 
      } 
     </span> 
    </div> 
</div> 
<div id="comments"> 
    @foreach (var comment in Model.Comments) 
    { 
     <b>@Html.DisplayFor(modelItem => comment.Name)</b> <text>says... </text><br /> 
     <i>@Html.DisplayFor(modelItem => comment.Content)</i><br /> 
    } 
</div> 

Dans la div "comments", je souhaite ajouter un moyen de créer un nouveau commentaire, ce qui ne se fait évidemment pas de la manière traditionnelle avec un ViewModel étant le modèle au lieu du modèle "Commentaires". Par où commencer ici?

Je suis fondamentalement nouveau à MVC3 et l'idée de poster est très confuse par rapport à ce que j'étais habitué à des formulaires Web. Toute aide serait utile, merci!

(je modifier ce poste avec une personne d'information supplémentaire peut être nécessaire)

Répondre

1

Je vous ne l'avez pas déjà, je vous recommande vivement de commencer à vous apprendre quelques jquery. Je créerais moi-même une boîte de commentaires de style ajax avec un bouton de soumission qui est seulement accessible pour les utilisateurs authentifiés, openid, ou un fournisseur d'appartenance personnalisé.

Vous voudrez apprendre à utiliser les méthodes $ .ajax et $ .post dans jquery, ainsi que la construction d'objets json à utiliser avec ces méthodes.

<input type="textarea" id="commentBox"></input> 
<input type="button" onclick="submitComment();" value="SUBMIT" /> 

function submitComment(){ 
    var newComment = { 
     comment: $("#commentBox").val(), 
     blogpostid: $("#PostID").val() 
    } 

    $.post("/BlogPost/AddComment",newComment,function(data){ 
      // append text to bottom of comments 
      if(data.Error){ 
       alert(data.ErrorMessage); 
      } else { 
       $("#comments").append('<div id="commentDiv">' + newComment.comment + '</div'>); 
      } 
    }); 
} 

Votre contrôleur BlogPost

public JsonResult AddComment(string comment, int blogpostid) 
{ 
     // snag user info from authenticated session 

     // save comment 

     // return an object that has a boolean and a string it would look something like this. 

     var commentResult = new object{ Error = true, ErrorMessage = 'we could not save the comment'}; 

     return Json(commentResult); 
} 

cela ne couvre pas tout et il y a beaucoup plus que vous aurez besoin de coder à la fois sur le client et côté serveur, y compris les mesures de sécurité.

Questions connexes