Передать два значения для просмотра? - PullRequest
4 голосов
/ 27 июля 2011

У меня есть запрос, где мне нужно получить сообщение + каждый тег, который у него есть. Но поскольку теги находятся в отдельной таблице, это усложняет мне задачу по двум причинам. Я не совсем уверен, что мне даже нужно передать два значения, может быть, я могу сделать это как-то по-другому.

Обратите внимание, что модель создается автоматически с использованием классов LINQ to SQL.


DB

enter image description here

код

public ActionResult Edit(int id)
{
    // Get post from DB
    var post = (from p in _db.Posts
                where p.ID == id
                select p).Single();

    // Get PostTags from DB
    var postTag = (from pt in _db.PostTags
                   where pt.PostID == id
                   select pt);

    // Now looping through PostTags in order to find all tag names associated with the post
    string tagList = string.Empty;
    foreach (var pt in postTag)
    {
        var tag = (from t in _db.Tags
                   where t.ID == pt.TagID
                   select t).Single();
        tagList += tag.Name + " ";
    }
    return Content(tagList); // This works as intended, outputs all tags for current post

    return View(); // How can I return post itself + tagList ?
}

Задача

  1. Как видите, я хочу передать post своему представлению, и это имеет смысл, но мне нужно как-то передать строку tagList, которая также содержит теги. Как я могу это сделать?

  2. Я думаю, что мой запрос плохой. У меня нет опыта работы с SQL / LINQ, так что это единственное, что я придумал. Может быть, я могу сделать то же самое несколько «умнее»?

Ладно, спасибо за ответы. И ViewBag, и создание BlogViewModel хороши. Я пойду с BlogViewModel, я думаю. Но мой второй вопрос все еще остается.

Ответы [ 4 ]

3 голосов
/ 27 июля 2011

Рассматривали ли вы создание ViewModel, которая будет содержать оба этих объекта, и передачу этой ViewModel в ваш View? Вы также можете использовать LINQ для улучшения своих запросов.

(Примечание: я отправляю сообщение с моего телефона, чтобы синтаксис мог быть отключен)

Модель:

public class TaggingModel
{
   public string TagList {get; set;}
   public PostClass Post {get; set;}
}

public TaggingModel(string tagList, Post post)
{
    this.TagList = tagList;
    this.YourPost = post;
}

Код (с использованием LINQ):

var post = _db.Posts.Where(pt => pt.PostID == id).Single();
var postTags = post.PostTags.Where(pt => pt.PostID == id);

string tagList = string.Empty;

foreach(var pt in postTags)
{
     var tag = _db.Tags.Where(t => t.ID == pt.TagID).Single(); 
     tagList += tag.Name + " ";
}

TaggingModel model = new TaggingModel(tagList, post);

return View(model);

Вы также можете использовать другие методы для отправки сообщения, такие как сохранение их в ViewData, если вы не хотите реализовывать для него модель.

2 голосов
/ 27 июля 2011

Вы можете использовать динамический объект ViewBag или ViewData для передачи одного элемента, использовать второй элемент в качестве модели для представления. Также вы можете определить класс viewmodel или использовать Tuple

ViewData["tags"] = tagsList;
return View(post);

или если вы не хотите создавать модель представления, но по-прежнему хотите строго типизированное представление

return View(Tuple.Create(post, tagsList));
1 голос
/ 27 июля 2011

Определите класс View Model, который имеет свойство для публикации и свойство для tagList, и передайте его в вызове View ().

0 голосов
/ 27 июля 2011

Я предпочитаю создавать модель, которая содержит два разных объекта и свойства:

public class EditPageModel()
{
    public PostClass Post (get; set;}
    public string TagList {get; set;}
}

Тогда верните это:

return View (new EditPageModel(){Post = post, TagList = tagList});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...