ViewModel的单向数据绑定

时间:2010-09-08 07:57:09

标签: asp.net-mvc asp.net-mvc-2

我的ViewModel中有一些字段,我只需要在视图中输出。但是在提交表格时他们总是收到发送。这不仅烦人,而且危险,因为我绝对不希望这些视图模型字段的数据绑定。

为我的某些viewmodel属性定义OneWay数据绑定是否有任何变化?

提前谢谢

编辑:

问题是,当我点击动作链接时,图片和ValidSizes List会被发送回服务器。

  

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 个答案:

答案 0 :(得分:1)

  1. 使用单独的ViewModel进行表单输入
  2. 使用IEnumerable而不是List
  3. 在动作输入参数
  4. 上使用[Bind(Exclude =“Pictures,ValidSizes”)]
  5. 使用私人制定者
  6. 如果您不需要图片/ ValidSizes,请不要创建表单输入元素
  7. 等等。

    更新

    您不将不同的ViewModel分配给视图,而是分配给处理链接点击的控制器操作。从您的问题看来,您所需要的不是“单向”绑定,而是避免URL中的额外字符 - 因为,如果您的ValidSizes是IEnumerable,它将不会被更改,并且无论如何在您的URL中它的数据是错误的,赢了不会导致更新 - 所以它已经是“单向”绑定。

    这是我能找到的问题: http://forums.asp.net/t/1328683.aspx

    至于解决方案,我自己从不使用ActionLink助手,因为它是一个漏洞的抽象,我不喜欢与它斗争。简单的html链接标记总是好多了。

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

    我实际上使用了我自己的几行版本的BuildUrlFromExpression。另请参阅上面的链接,了解如何通过匿名对象而不是模型传递参数(new {PageSize = Model.PageSize,index = Model.index})。