新足迹

 找回密码
 注册

精华好帖回顾

· 朝花溪拾 (2016-11-27) 春浅 · 墨尔本东区/东南Bayside两栋普通房产18年来的价位变化 (2007-12-16) villa
· 状况连连的鬼月斐济行(游记+攻略 万字长文) (2018-10-14) 海边小妹 · 【136mydream】美味家常菜下厨系列 (2011-7-23) 136mydream
Advertisement
Advertisement
查看: 1280|回复: 12

MVC3 里面ViewModel的一个问题 [复制链接]

发表于 2012-7-13 17:29 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
假设我有一个viewmodel的class

除了porperty CollectState, DeliverState之外还有这个

  public IEnumerable<SelectListItem> States
        {
            get
            {
                return new List<SelectListItem>
                           {                              
                               new SelectListItem{Text = "ACT", Value = "ACT"},
                               new SelectListItem{Text = "NSW", Value = "NSW"},
                               new SelectListItem{Text = "NT", Value = "NT"},
                               new SelectListItem{Text = "QLD", Value = "QLD"},
                               new SelectListItem{Text = "SA", Value = "SA"},
                               new SelectListItem{Text = "TAS", Value = "TAS"},
                               new SelectListItem{Text = "VIC", Value = "VIC"},
                               new SelectListItem{Text = "WA", Value = "WA"}
                           };
            }
        }


现在的问题是:在一个view里面,因为既有collect state 也有 delivery state dropdownlist, 我在邦定后需要 select dropdownlist item的时候应该怎么写? 就好比譬如:

  public IEnumerable<SelectListItem> States
        {
            get
            {
                return new List<SelectListItem>
                           {                              
                               new SelectListItem{Selected = CollectState.Equals("ACT"), Text = "ACT", Value = "ACT"},
                               new SelectListItem{Selected = CollectState.Equals("NSW"),Text = "NSW", Value = "NSW"},
                               new SelectListItem{Selected = CollectState.Equals("NT"),Text = "NT", Value = "NT"},
                               new SelectListItem{Selected = CollectState.Equals("QLD"),Text = "QLD", Value = "QLD"},
                               new SelectListItem{Selected = CollectState.Equals("SA"),Text = "SA", Value = "SA"},
                               new SelectListItem{Selected = CollectState.Equals("TAS"),Text = "TAS", Value = "TAS"},
                               new SelectListItem{Selected = CollectState.Equals("VIC"),Text = "VIC", Value = "VIC"},
                               new SelectListItem{Selected = CollectState.Equals("WA"),Text = "WA", Value = "WA"}
                           };
            }
        }



我知道不能harcode红色的部分,因为这样只能保证一个state被选择正确。另外一个delivery state无法选择正确的值了。。。又不想在建一个dropdownlist给deliver state。。。。那么应该怎么实现呢?

[ 本帖最后由 梦呓人 于 2012-7-13 16:35 编辑 ]

评分

参与人数 1积分 +1 收起 理由
一路走来 + 1 原来你是IT男

查看全部评分

Advertisement
Advertisement

发表于 2012-7-13 17:53 |显示全部楼层
此文章由 uowzd01 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 uowzd01 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有点迷惑,你是要collect state 和 delivery state选定的都是一样吗?

评分

参与人数 1积分 +2 收起 理由
梦呓人 + 2

查看全部评分

发表于 2012-7-13 18:43 |显示全部楼层

回复 uowzd01 2# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
它们是不一样的。

我红色的部分事实上是不正确的,因为它只保证了collect state选择正确,我可以再写一个给deliver state,但代码就很烦琐看上去

特殊贡献奖章

发表于 2012-7-13 18:52 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我喜欢把所有的state写入一个数组(ACT,NSW,NT....),然后loop这个数组,你的CollectState.Equals,Text,Value都是这个数组的值
这样就没有这么多state的重复,然后你建两个list也看上去不会太繁琐了

评分

参与人数 1积分 +2 收起 理由
梦呓人 + 2

查看全部评分

发表于 2012-7-13 19:06 |显示全部楼层

回复 kr2000 4# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
kr你说的很对,我已经建了一个State Class,然后写成:


                List<State> statelist = new List<State>
                         {                              
                               new State{Name = "ACT", Value = "ACT"},
                               new State{Name = "NSW", Value = "NSW"},
                               new State{Name = "NT", Value = "NT"},
                               new State{Name = "QLD", Value = "QLD"},
                               new State{Name = "SA", Value = "SA"},
                               new State{Name = "TAS", Value = "TAS"},
                               new State{Name = "VIC", Value = "VIC"},
                               new State{Name = "WA", Value = "WA"}
                          };

                SelectList selectstatelist = new SelectList(statelist, "Value", "Name",应该怎么去邦定??);
                return selectstatelist;



现在最大的问题就是红色的Select Value我应该怎么去邦定?Collect State和Deliver State只能2选1啊,但我的view上会有2个dropdownlist

发表于 2012-7-13 19:10 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我在template view 里面可以加一个参数进去 譬如source="collect " 或者 source = "deliver"。


但是viewmodel不像controller class可以用ViewBag.source 去接收。。。。
Advertisement
Advertisement

特殊贡献奖章

发表于 2012-7-13 19:13 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我不会.net

发表于 2012-7-13 20:18 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
可以这样,
<%=HTML.listboxfor(x=>x.selectedDeliveryState, model.Statelist,new{something here if you like} %>

再写另一行针对另一State
自动绑定
总之如果没理解错,用Html.listboxfor 就可以
仅供参考

[ 本帖最后由 典 于 2012-7-13 19:21 编辑 ]

评分

参与人数 1积分 +2 收起 理由
梦呓人 + 2

查看全部评分

发表于 2012-7-13 21:21 |显示全部楼层
此文章由 mortdale 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mortdale 所有!转贴必须注明作者、出处和本声明,并保持内容完整
public class MyViewModel
{  
public IEnumerable<SelectListItem> States
        {
            get
            {
                return new List<SelectListItem>
                           {                              
                               new SelectListItem{Text = "ACT", Value = "ACT"},
                               new SelectListItem{Text = "NSW", Value = "NSW"},
                               new SelectListItem{Text = "NT", Value = "NT"},
                               new SelectListItem{Text = "QLD", Value = "QLD"},
                               new SelectListItem{Text = "SA", Value = "SA"},
                               new SelectListItem{Text = "TAS", Value = "TAS"},
                               new SelectListItem{Text = "VIC", Value = "VIC"},
                               new SelectListItem{Text = "WA", Value = "WA"}
                           };
            }

        }
public string[] selectedCollectState{get;set;}
public string[] selectedDeliverState{get;set;}
}

View就用楼上写的,会自动绑定到selectedCollectState和selectedDeliverState

评分

参与人数 1积分 +2 收起 理由
梦呓人 + 2

查看全部评分

发表于 2012-7-13 21:50 |显示全部楼层
此文章由 uowzd01 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 uowzd01 所有!转贴必须注明作者、出处和本声明,并保持内容完整
用这个应该可以@Html.DropDownListFor(x => x.CollectionState, IEnumerable<SelectListItem>(Model.States, "text", "value")

你的view有两个dropdownlistfor, 分别绑定到你的viewmodel的collectionstate and delieverstate,不需要用到selected=blah blah

[ 本帖最后由 uowzd01 于 2012-7-13 21:00 编辑 ]

评分

参与人数 1积分 +2 收起 理由
梦呓人 + 2

查看全部评分

发表于 2012-7-14 01:17 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
谢谢各位兄弟周末还来回帖。


我的问题要稍微复杂一些,我整个说一下。这个viewModel我们叫它JobViewModel(里面有一个Job类型的object),我最上层的View叫做:Add



1,在Add View里面我们引用了JobViewModel,同时有一个Job的Template view在Edit Templates目录下,所以写起来是:
@Html.EditorFor(m => m.Job, "Job", "", new { StateList = Model.States })



2, 然后在这个Job的Template里面我们有:
@Html.EditorFor(m => m.CollectAddress)
@Html.EditorFor(m => m.DeliveryAddress)



3,然后这2个address的类型是叫做“Location” Class,所以又有这么一个template。并且在Location Template View里面我们用:
Html.DropDownListFor(m=> m.State, (IEnumerable<SelectListItem>)ViewBag.StatesList)
来接受从最上层Job View传递过来的States list. (它是用自己的Location model)





现在就是:Location template包含textbox(譬如街名)和一个dropdownlist(states list)。 这个template是不管collect还是delivery的。



所以view ”Add“没有直接绑定到JobViewModel的某个property,也没有直接用dropdownlist,而是中间有一个Job template,然后往下还有一个Location template,最后这个location template用了dropdownlist。



我最后的直觉在6楼说的那样,是不是可以借助(2)多写一个paramter,然后pass给(3)做点什么?

(希望我解释清楚了)

评分

参与人数 1积分 +4 收起 理由
uowzd01 + 4 头像是亮点

查看全部评分

Advertisement
Advertisement

发表于 2012-7-14 03:43 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
搞定了


@Html.DropDownListFor(x => x.State, new SelectList((IEnumerable<SelectListItem>)ViewBag.StateList,"text", "value", Model.State)

一次就可以实现2个绑定

发表于 2012-7-16 10:34 |显示全部楼层
此文章由 uowzd01 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 uowzd01 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我有个页面是这样写滴
@Html.DropDownListFor(model => model.CategoryId, new SelectList(ViewBag.CategoryList, "Value", "Text"))

很多人批评用viewbag不好,但是有时候真的很方便

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部