SelectList Проблема с выбранным значением

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

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

Модель представления

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. Однако каждый раз, когда страница загружается, она выбирает "Выберите сайты", однако, когда я меняю второй ("site1"), кажется, все работает нормально.

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

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

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

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

Изменить: Решено

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

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

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

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

Я надеюсь, что это поможет кому-то в будущем, потому что, клянусь богом, на это ушла целая вечность!


person Anthony Wood    schedule 24.01.2012    source источник
comment
Это не имеет ничего общего с вашим вопросом, но ваш код очень избыточен. Обычно лучше не дублировать нетривиальные объемы кода.   -  person usr    schedule 25.01.2012
comment
?? Я пытаюсь понять, почему один работает, а другой нет? или вы имеете в виду, что я не должен включать переполнение стека? Я не хочу, чтобы оба в моем коде!   -  person Anthony Wood    schedule 25.01.2012
comment
О, похоже, я не получил вашу записку. Сорри за путаницу.   -  person usr    schedule 25.01.2012
comment
@AnthonyWood, покажите нам полный пример вашего нерабочего кода. Модель, контроллер и представление были бы великолепны. Ваш вопрос сейчас не имеет особого смысла.   -  person Darin Dimitrov    schedule 25.01.2012
comment
@AnthonyWood, нет, совсем не лучше. Я не хочу 1000 строк кода. Я хочу, чтобы вы изолировали и урезали свой код до примера, позволяющего воспроизвести проблему. Никто не заботится о ваших репозиториях, контекстах и ​​прочем. Вы можете отлично настроить значения жесткого кода в своих действиях GET и POST. Также максимально упростите свои модели. Показывать только релевантные свойства. Показать все представление, включая определение формы и поля ввода для свойств вашей модели (еще раз только урезанная версия). Для выпадающего списка обычно достаточно 2 свойств.   -  person Darin Dimitrov    schedule 25.01.2012
comment
@DarinDimitrov Я внес некоторые изменения в вопрос. Спасибо за вашу помощь   -  person Anthony Wood    schedule 25.01.2012


Ответы (2)


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

Изменить: после того, как вы добавили это, оба списка должны вести себя одинаково.

person usr    schedule 24.01.2012
comment
И, пожалуйста, расскажите, что случилось. - person usr; 25.01.2012

Вам не просто нужно

ViewModel.site1
ViewModel.site2

??

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

ViewModel.site

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

person Secret Squirrel    schedule 24.01.2012
comment
Да, спасибо, это решает проблему их поведения по-разному, теперь они оба не работают, но это дает мне возможность работать. Благодарность - person Anthony Wood; 25.01.2012
comment
это странно, потому что другой, касающийся списка выбора компании, работает отлично: / я сбит с толку! - person Anthony Wood; 25.01.2012