SelectList Выбранная стоимость вопроса - PullRequest
0 голосов
/ 25 января 2012

У меня есть код, второй из которых работает, а первый нет.Идея состоит в том, что пользователь выбрал сайт, а затем он отображает информацию для этого сайта, при выборе сайта автоматически отправляется форма.

ПРИМЕЧАНИЕ. Второй мне не нужен, япросто сделал это, чтобы попытаться выяснить, почему первый не работал

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>
       }
    }
}

Теперь, когда я выбираю верхний "сайт" , он имеет правильное выбранное значение (когда яотладка в контроллере), и правильный атрибут items установлен в true.Однако каждый раз, когда страница загружается, она выбирает "Пожалуйста, выберите сайты" , однако, когда я меняю второй * ("site1") , кажется, все работает нормально.

Какие-либо предложения?Спасибо.

Я заметил еще кое-что странное, если я изменю код внутри:

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

, чтобы использовать viewModel.site вместо viewModel.site1, это будет работать ... что-тоСтранно происходит здесь

Редактировать: Решено

Исправление было изменить все на другое имя.Я думаю, почему-то, когда я звоню

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

, он пытается сопоставить его со свойством site в моей SitesViewModel, а это не то, что я хотел!В настоящее время я переименовал его в «site1», и все, кажется, работает должным образом, это объясняет, почему в приведенном выше коде он вообще не работал, затем, когда я добавил свойство site1 согласно ответу Secret Squirrel,

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

Надеюсь, это поможет кому-то в будущем, потому что, черт возьми, на разработку ушли целые века!

Ответы [ 2 ]

0 голосов
/ 25 января 2012

тебе не просто нужна

ViewModel.site1
ViewModel.site2

??

, поскольку это не последний параметр выбранного элемента, поэтому при отладке да будет выбран правильный элемент. но тогда он упадет во вторую часть и

ViewModel.site

станет чем-то другим?

0 голосов
/ 25 января 2012

Попробуйте добавить ModelState.Clear () непосредственно перед возвратом из метода действия.Помощники MVC иногда получают значение из состояния модели.Этот тест покажет вам, является ли ModelState вашей проблемой.

Редактировать: после добавления этого оба списка должны вести себя одинаково.

...