OneWay привязка данных для ViewModel - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть некоторые поля в моей ViewModel, которые мне нужны только для вывода в моем View. Но они всегда отправляются при отправке формы. Это не только раздражает, но и опасно, потому что я определенно не хочу привязку данных для этих полей viewmodel.

Есть ли какие-либо изменения для определения привязки данных OneWay для некоторых из моих свойств viewmodel?

Спасибо заранее

EDIT:

Проблема заключается в том, что список Pictures и ValidSizes отправляется обратно на сервер, когда я щелкаю ссылку ActionLink.

http://localhost:52176/?PageSize=30&Index=31&Pictures=System.Collections.Generic.List%601[System.String]&Size=100&ValidSizes=System.Collections.Generic.List%601[System.Web.Mvc.SelectListItem]

public class PicturesViewModel
{
    public const int SMALL = 100;
    public const int MIDDLE = 150;
    public const int BIG = 250;

    public int PageSize { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="PicturesViewModel"/> class.
    /// </summary>
    public PicturesViewModel()
    {
        Pictures = new List<string>();
        Size = SMALL;
        Index = 1;
        PageSize = 30;
    }

    /// <summary> Gets or sets the index. </summary>
    public int Index { get; set; }

    /// <summary>
    /// Gets or sets the picture links.
    /// </summary>
    /// <value>The picture links.</value>
    public List<string> Pictures { get; private set; }

    /// <summary>
    /// Gets or sets the size.
    /// </summary>
    /// <value>The size.</value>
    public int Size { get; set; }

    private List<SelectListItem> validSizes = null;

    /// <summary>
    /// Gets the valid sizes.
    /// </summary>
    /// <value>The valid sizes.</value>
    public IEnumerable<SelectListItem> ValidSizes
    {
        get {
            if (validSizes != null)
                return validSizes;

            validSizes = new List<SelectListItem>
            {
                new SelectListItem(){Text = "Small", Value = SMALL.ToString()},
                new SelectListItem(){Text = "Middle", Value = MIDDLE.ToString()},
                new SelectListItem(){Text = "Big", Value = BIG.ToString()}
            };

            return validSizes;
        }
    }
}

EDIT2:

    <div id="pager_left"> 
        <%= Html.ActionLink("Prev", "Prev", Model)%>
    </div></td>

Это ссылка действия, которая вызывает привязку.

1 Ответ

1 голос
/ 08 сентября 2010
  1. Использовать отдельную ViewModel для ввода формы
  2. Использовать IEnumerable вместо списка
  3. Использовать [Bind (Exclude = "Pictures, ValidSizes")] для параметра ввода действия
  4. Использовать частные сеттеры
  5. Не создавать элементы ввода формы для Pictures / ValidSizes, если они вам не нужны

и т. Д.

Обновить:

Вы назначаете другую ViewModel не для представления, а для действия контроллера, которое обрабатывает щелчок по ссылке.И из ваших вопросов кажется, что вам нужно не одностороннее связывание, а избежание лишних символов в URL - потому что, если ваш ValidSizes имеет значение IEnumerable, он не будет изменен, и в любом случае в вашем URL его данные неверны, выигралне вызывает обновления - так что это уже «односторонняя» привязка.

Вот что я могу найти для вашей проблемы: http://forums.asp.net/t/1328683.aspx

Что касается решения, я никогда не использую помощник ActionLink сампотому что это дырявая абстракция и я не люблю с ней бороться.Простой HTML-тег ссылки всегда намного лучше.

<a href="<%= Html.BuildUrlFromExpression<>() %>" />

Я на самом деле использую для этого свою собственную версию BuildUrlFromExpression в несколько строк.Также смотрите в ссылке выше, как вы можете передавать параметры через анонимный объект вместо Model (new {PageSize = Model.PageSize, index = Model.index}).

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