SelectList选择值问题

时间:2012-01-24 20:56:37

标签: c# asp.net-mvc-3 asp.net-mvc-2 selectlist selectlistitem

我有一些代码,第二个有效,第一个没有。想法是用户选择了一个站点,然后显示该站点的信息,选择一个站点自动提交表单。

注意:我不需要第二个,我只是试着弄清楚为什么前者不起作用

视图模型

public class SitesViewModel
{
    public SitesViewModel()
    {
        int allowMaintainSites = SessionWrapper.AllowMaintainSites.HasValue ? SessionWrapper.AllowMaintainSites.Value : 0;
        this.isAllowedMaintain = allowMaintainSites == 1;

    }
    public SelectList companySelectList { get; set; }
    public SelectList siteSelectList { get; set; }
    public SelectList siteSelectList1 { get; set; }
    public SelectList siteTypeSelectList { get; set; }
    public bool isAllowedMaintain { get; set; }
    public bool isAllowedSuper { get; set; }
    public bool companySelected { get; set; }
    public bool siteSelected { get; set; }
    public bool hasSites { get; set; }
    public int? currentSite { get; set; }
    public int? companyId { get; set; }
    public Site site { get; set; }
    public Site site1 { get; set; }
}

控制器:

[HttpGet()]
public ActionResult Sites()
{
    var viewModel = new SitesViewModel();
    viewModel.companySelectList = viewModel.isAllowedMaintain ?
            new SelectList(context.GetCompaniesAll(), "companyId", "name") :
            new SelectList(context.GetCompaniesByUser(SessionWrapper.UserId.Value), "companyId",  "name");
        return View(viewModel);
}
[HttpPost()]
public ActionResult Sites(string data)
{
    var viewModel = new SitesViewModel();
    if (Request["company"] != null)
    {
        int? companyId = stringToNullInt(Request["company"]);
        viewModel.companySelected = true;
        viewModel.companyId = companyId;
        viewModel.companySelectList = viewModel.isAllowedMaintain ?
                new SelectList(context.GetCompaniesAll(), "companyId", "name",companyId) :
                new SelectList(context.GetCompaniesByUser(SessionWrapper.UserId.Value), "companyId", "name",companyId);
        viewModel.siteSelectList = new SelectList(context.GetSitesByCompany(companyId,false),"siteId","name") ;
        viewModel.siteSelectList1 = new SelectList(context.GetSitesByCompany(companyId, false), "siteId", "name");
        viewModel.hasSites = context.GetSitesByCompany(companyId, false).Count() > 0;

        if(!Request["site"] == null)
        {
            int? siteId  = stringToNullInt(Request["site"]);
            viewModel.site = context.GetSiteById(siteId).FirstOrDefault();
            viewModel.siteSelectList = new SelectList(context.GetSitesByCompany(companyId, false), "siteId", "name", viewModel.site.siteId.Value);
        }
        if(!Request["site1"] == null){
            int? siteId  = stringToNullInt(Request["site1"]);
            viewModel.site1 = context.GetSiteById(siteId).FirstOrDefault();
            viewModel.siteSelectList1 = new SelectList(context.GetSitesByCompany(companyId, false), "siteId", "name", viewModel.site1.siteId.Value);
        }
     }
}

查看

@using (Html.BeginForm())
{
    @Html.ValidationSummary(false, "Please fix these errors.");

<div id="CustomerSelect">
    <div class="labels">
            <b class="head">Select Customer</b>
        </div>
        <div class="editors">
    @Html.DropDownList("company", @Model.companySelectList, "Please Select Customer", new Dictionary<string, object> { { "class", "selectList" }, { "onchange", "submit()" } })
        </div>
</div>
    if (Model.companySelected)
    {
        if (!Model.hasSites)
        {
            <div class="result">
                <p>
                    <b class="head">There are no sites found.</b>
                </p>
            </div>
        }
        else
        {
            <div id="SiteSelect">
                <p class="labels">
                    <b class="head">Select Site</b>
                </p>
                <p class="editors">
                   @Html.DropDownList("site",@Model.siteSelectList,"Please Select Site",new Dictionary<string,object>{{"class","selectList"},{"onchange","submit()"}})
                    @Html.DropDownList("site1",@Model.siteSelectList1,"Please Select Site",new Dictionary<string,object>{{"class","selectList"},{"onchange","submit()"}})
                </p>
            </div>
       }
    }
}

现在,当我选择顶部的“site”时,它具有正确的选定值(当我在控制器中调试时)并且正确的items属性设置为true。但是每次页面加载时,它都会选择“请选择站点”但是当我更改第二个(“site1”)时,一切似乎都能正常工作。

有什么建议吗? 感谢。

我注意到发生了一些奇怪的事情,如果我改变了里面的代码:

if(!Request["site"]==null){
}

使用viewModel.site而不是viewModel.site1它会起作用......这里发生了一些奇怪的事情

编辑:已解决

修复方法是将所有内容更改为其他名称。我想不知何故,当我打电话

Html.DropDownList("site",....) 

它试图将它与我的SitesViewModel中的属性,网站匹配,这不是我想要的!我目前已将其重命名为“site1”,一切似乎都正常工作,这解释了为什么在上面的代码中,它根本不起作用,然后当我根据Secret Squirrel的答案添加了site1属性时,

Html.DropDownList("site1",...) didn't work either!

我希望这可以帮助将来的某个人,因为上帝需要很长时间才能锻炼出来!

2 个答案:

答案 0 :(得分:0)

尝试在从action方法返回之前添加ModelState.Clear()。 MVC助手有时会从模型状态中获取值。此测试将告诉您ModelState是否是您的问题。

编辑:添加完成后,两个列表的行为应相同。

答案 1 :(得分:0)

你不只是需要一个

ViewModel.site1
ViewModel.site2

...

因为不是所选项目的最终参数,所以在调试时它将选择正确的项目。 但接下来它将落入第二部分和

ViewModel.site

会变成别的吗?