选择列出所选值问题
本文关键字:问题 选择 | 更新日期: 2023-09-27 18:21:22
我有一些代码,第二个有效,第一个无效。这个想法是,用户已经选择了一个网站,然后它显示这个网站的信息,选择一个网站自动提交表单
注意:我不需要第二个,我只是想弄清楚为什么前者不起作用
ViewModel
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"时,它具有正确的选定值(当我在控制器中调试时),并且correct items属性设置为true。然而,每次加载页面时,它都会选择"请选择站点"。然而,当我更改第二个("站点1")时,一切似乎都很好。
有什么建议吗?谢谢
我注意到发生了另一件奇怪的事情,那就是如果我更改里面的代码:
if(!Request["site"]==null){
}
要使用viewModel.site而不是viewModel.site1,它将起作用。。。发生了一些奇怪的事情
编辑:已解决
解决方法是将所有内容更改为不同的名称。我想不知怎么的,当我打电话给时
Html.DropDownList("site",....)
它试图将它与我的SitesViewModel中的属性、站点相匹配,这不是我想要的!我目前已经将其重命名为"site1",一切似乎都正常工作,这解释了为什么在上面的代码中,它根本不起作用,然后当我根据Secret Squirrel的回答添加site1属性时,
Html.DropDownList("site1",...) didn't work either!
我希望这能帮助到未来的某个人,因为天哪,这需要很长时间才能解决!
在从操作方法返回之前尝试添加ModelState.Clear()。MVC帮助程序有时会从模型状态中获取值。此测试将告诉您ModelState是否是您的问题。
编辑:添加后,两个列表的行为应该相同。
您不仅仅需要吗
ViewModel.site1
ViewModel.site2
由于不是所选项目的最终参数,因此在调试"是"时,它将选择正确的项目。但随后它将进入第二部分和
ViewModel.site
会变成别的东西吗?