0

私はいくつかのコードを持っています.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!

うまくいくのに何年もかかった神によって、これが将来誰かに役立つことを願っています!

4

2 に答える 2

0

アクション メソッドから戻る直前に ModelState.Clear() を追加してみてください。MVC ヘルパーは、モデルの状態から値を取得することがあります。このテストは、ModelState に問題があるかどうかを示します。

編集:これを追加すると、両方のリストが同じように動作するはずです。

于 2012-01-24T21:05:24.463 に答える
0

単に必要なだけではありませんか

ViewModel.site1
ViewModel.site2

??

as は選択された項目の最終パラメータではないため、デバッグ時に yes で正しい項目が選択されます。しかし、それは2番目の部分に落ちて、

ViewModel.site

別のものになりますか?

于 2012-01-24T21:35:32.683 に答える