ASP.NET MVC 3: модель постов в блогах - PullRequest
2 голосов
/ 11 декабря 2011

У меня есть модель с сущностями BlogPost и Tag.

public class Tag
{
    public string Name { get; set; }
    public string Slug { get; set; }
}

public class BlogPost : ITaggable
{
    public BlogPost()
    {
        this.Tags = new List<Tag>();
    }
    public ICollection<Tag> Tags { get; set; }
    [AllowHtml]
    public string Text { get; set; }
}

В админке BlogPost теги страницы редактирования должны быть представлены одним текстовым вводом, разделенным запятой. Очень похоже на ввод тега StackOverflow.

Это означает сериализацию ICollection в строку и десерализацию обратно в коллекцию. Я доволен связывателем моделей по умолчанию рядом с коллекцией тегов BlogPost.

Есть несколько вариантов, которые я знаю, чтобы справиться с этим:

  1. Пользовательская модель Binder - с необходимостью переопределить все привязки BlogPost - в реальной сущности BlogPost действительно много свойств.

  2. Создание текстового ввода, не связанного с моделью BlogPost, и получение / установка его значений с использованием параметров формы. Это требует больше ручной работы.

  3. Что-то еще ...

Как бы вы внедрили теги для ввода в блоге?

UPDATE:

А пока я пробую это:

public List<Tag> Tags { get; set; }
public string TagsString { 
    get 
    { 
        var tags = Tags.Select(tg => tg.Name).ToArray();
        var res = string.Join(",", tags);
        return res;
    } 
    set 
    {
        var tags = value.Split(',');
        Tags = new List<Tag>();
        foreach (var tag in tags)
            Tags.Add(new Tag { Name = tag });
    } 
}

Ответы [ 2 ]

4 голосов
/ 11 декабря 2011

Это идеальный случай для введения ViewModel между вашим обзором и вашей моделью.

A ViewModel позволит вам изменить представление ваших данных (разделить их на строки) для конкретного представления (рекомендуется создавать их для каждого представления) без изменения целостности вашей модели.

Тогда ваш контроллер будет отвечать за сериализацию / десериализацию.

Вот несколько статей, рассказывающих о необходимости и способах использования ViewModels в приложениях ASP.NET MVC:

1 голос
/ 11 декабря 2011

Я хотел бы сохранить интерфейс пользователя / UX, чтобы они отображались через запятую в одном текстовом поле.

Что касается получения их в виде набора в контроллере, я лично придерживался стандартного связующего для моделей, но это не обязательно означает, что это правильный путь.

Я бы сделал что-то похожее на ваш # 2, однако я бы использовал <select multiple="multiple">, чтобы для каждого тега был элемент 1 <option selected="selected">TagName/Slug</option>.

Что касается поддержания зависимости / привязки между текстовым полем и списком множественного выбора, я бы использовал для этого knockoutjs . Разберите запятые в текстовом поле и обновите (скрытый) множественный выбор. При отправке в контроллер игнорируйте текстовое поле (или просто не включайте его в свою серверную модель просмотра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...