2011-06-18 3 views
1

J'ai une vue où j'ai besoin d'utiliser 2 modèles parce que j'essaye d'autocleter la boîte. La vue est d'ajouter une question comme à stackoverflow. Vous devez entrer du contenu et sélectionner des tags dans la saisie semi-automatique.Utilisation de deux modèles à une vue avec le rasoir

public class QuestionController : Controller 
    { 
     public ActionResult Add() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Add(QuestionModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       return View(model); 
      } 
     } 

     public ActionResult TagName(string q) 
     { 
      var tags = new List<TagModel> 
          { 
           new TagModel {Name = "aaaa", NumberOfUse = "0"}, 
           new TagModel {Name = "mkoh", NumberOfUse = "1"}, 
           new TagModel {Name = "asdf", NumberOfUse = "2"}, 
           new TagModel {Name = "zxcv", NumberOfUse = "3"}, 
           new TagModel {Name = "qwer", NumberOfUse = "4"}, 
           new TagModel {Name = "tyui", NumberOfUse = "5"}, 
           new TagModel {Name = "asdf[", NumberOfUse = "6"}, 
           new TagModel {Name = "mnbv", NumberOfUse = "7"} 
          }; 

      var tagNames = (from p in tags where p.Name.Contains(q) select p.Name).Distinct().Take(3); 

      string content = string.Join<string>("\n", tagNames); 
      return Content(content); 
     } 

    } 

Szamam.Models espace de noms { public class QuestionModel {private string _content;

public string Content 
    { 
     get { return _content; } 
     set { _content = value; } 
    } 

    public UserModel Creator 
    { 
     get { return _creator; } 
     set { _creator = value; } 
    } 

    public DateTime CreationDate 
    { 
     get { return _creationDate; } 
     set { _creationDate = value; } 
    } 

    public List<TagModel> TagModels 
    { 
     get { return _tagModels; } 
     set { _tagModels = value; } 
    } 

    private UserModel _creator; 

    private DateTime _creationDate; 

    private List<TagModel> _tagModels=new List<TagModel>(); 
} 

}

Et il y a une vue

@model Szamam.Models.QuestionModel 
@{ 
    ViewBag.Title = "Add"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2> 
    Add</h2> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.autocomplete.js")" type="text/javascript"></script> 
<link href="@Url.Content("~/Scripts/jquery.autocomplete.css")" rel="stylesheet" type="text/css" /> 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>QuestionModel</legend> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Content) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Content) 
      @Html.ValidationMessageFor(model => model.Content) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.CreationDate) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CreationDate) 
      @Html.ValidationMessageFor(model => model.CreationDate) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.TagModels) 
     </div> 
     @*here is a place for autocomplete for tags *@ 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) 
    </div> 
     <script type="text/javascript"> 

      $(document).ready(function() { 
       $("#TagName").autocomplete('@Url.Action("TagName", "Question")', { minChars: 3 }); 
      }); 

     </script> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 


    </fieldset> 
} 

Evidement, il i un problème:

@*here is a place for autocomplete for tags *@ 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) 
     </div> 

Dans cette partie je veux avoir un autre modèle - TagModel.

Ceci est mon premier jour avec longue rasoir désolé pour ces questions stupides:/

J'ai vu d'autres questions à ce sujet à stackoverflow, mais je pense que les réponses ne sont pas utiles pour moi.

Que puis-je modifier pour afficher cette page?

Répondre

6

Vous devez créer un modèle de vue (eg.QuestionTagViewModel) qui a des propriétés QuestionModel et TagModel. Passez ensuite la QuestionTagViewModel à la vue que vous souhaitez utiliser dans

Mise à jour.

Exemple

public class QuestionTagViewModel { 
    public QuestionModel {get;set;} 
    public TagModel {get;set;} 
} 

Vous pourrez l'utiliser comme ceci:

Model.QuestionModel.Content 

et:

Model.TagModel.Name 

Regardez ici pour un exemple: Viewmodels

5

Ou vous pouvez passer un Tuple pour voir de contrôleur comme celui-ci

return View(new Tuple<QuestionModel, TagModel>(){...}); 
Questions connexes