私はいくつかのコードを持っています.2番目のコードは機能し、最初のコードは機能しません。ユーザーがサイトを選択すると、このサイトの情報が表示され、サイトを選択するとフォームが自動的に送信されます。
注:2番目のものは必要ありません。前者が機能しなかった理由を突き止めようとしただけです
ビューモデル
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>
}
}
}
ここで、一番上の「サイト」を選択すると、正しい値が選択され (コントローラーでデバッグする場合)、正しい項目属性が true に設定されます。ただし、ページが読み込まれるたびに「サイトを選択してください」が選択されますが、2番目のサイト(「site1」)を変更すると、すべて正常に動作するようです。
助言がありますか?ありがとう。
内部のコードを変更すると、何か他の奇妙なことが起こることに気付きました。
if(!Request["site"]==null){
}
viewModel.site1 ではなく viewModel.site を使用するとうまくいきます...ここで奇妙なことが起こっています
編集:解決済み
修正は、すべてを別の名前に変更することでした。電話するとなんとなく思う
Html.DropDownList("site",....)
私のSitesViewModelのプロパティ、サイトに一致させようとしますが、これは私が望んでいたものではありません! 現在、名前を「site1」に変更しましたが、すべてが適切に機能しているように見えます。これは、上記のコードでまったく機能しなかった理由を説明しています。Secret Squirrel の回答に従って、site1 プロパティを追加すると、
Html.DropDownList("site1",...) didn't work either!
うまくいくのに何年もかかった神によって、これが将来誰かに役立つことを願っています!