2010-09-08 49 views
2

我的ViewModel中有一些字段,我只需要在View中输出。但是在提交表单时他们总是被发送。这不仅令人讨厌,而且也是危险的,因为我绝对不希望这些视图模型字段的数据绑定。OneWay Databinding for ViewModel

对于我的一些viewmodel属性定义OneWay Databinding是否有任何改变?

THX提前

编辑:

问题IST,这些照片和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> 

这就是操作链接引起的结合。

+0

请提供您的查看代码。数据绑定仅适用于请求参数。请求参数使用视图中的表单字段创建。 – Christian13467 2010-09-08 08:00:49

回答

1
  1. 使用形式输入
  2. 使用IEnumerable的而不是List单独视图模型
  3. 用[绑定(排除= “图片ValidSizes”)]的动作输入参数
  4. 使用私人设置器
  5. 如果您不需要它们,请不要为图片/ ValidSizes创建表单输入元素

等等。

更新:

您不同的视图模型不分配到一个视图,但到处理链接点击控制器动作。从你的问题看,你需要的不是“单向”绑定,而是避免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})。

+0

1)如何将不同的ViewModel分配给视图? 2.)ValidSizes 已经使用IEnumerable。 3.)与没有相同的结果。 4)他们已经在使用私人定制者。 5.)我没有为它创建任何表单元素 - 至少不是用于图片。我唯一要做的就是调用ActionLink。 – BitKFu 2010-09-08 08:50:13

+0

啊太棒了!特别是匿名班的提示帮助了我很多。 – BitKFu 2010-09-08 10:14:26