Asp.net mvc DropDownList在ASP.Net MVC中无法100%正常工作

Asp.net mvc DropDownList在ASP.Net MVC中无法100%正常工作,asp.net-mvc,Asp.net Mvc,我对如何有效地使用ASP.NET MVC的Html.DropDownList帮助程序感到困惑 背景:我有一个5页的表单,每次单击“下一步”都会将数据保存到表单中。用户可以在节之间来回导航,因此以前的节已经预先填充了以前输入的数据 这适用于文本框。但不是下拉列表。我尝试了很多不同的方法,包括: 我有一个ViewModel,比如taht,我有我的列表和我的模型(LINQ到SQL生成的类)作为属性。例如: public class ConsultantRegistrationFormViewM

我对如何有效地使用ASP.NET MVC的Html.DropDownList帮助程序感到困惑

背景:我有一个5页的表单,每次单击“下一步”都会将数据保存到表单中。用户可以在节之间来回导航,因此以前的节已经预先填充了以前输入的数据

这适用于文本框。但不是下拉列表。我尝试了很多不同的方法,包括:

我有一个ViewModel,比如taht,我有我的列表和我的模型(LINQ到SQL生成的类)作为属性。例如:

public class ConsultantRegistrationFormViewModel
{
    public IConsultantRegistration ConsultantRegistration { get; private set; }

    public SelectList Titles { get; private set; }
    public SelectList Countries { get; private set; }
    public SelectList Currencies { get; private set; }
    public int CurrentSection { get; private set; }

    private ConsultantRegistrationFormViewModel(IConsultantRegistration consultantRegistration)
    {
        ConsultantRegistration = consultantRegistration;


        CurrentSection = 1;

        Titles = new SelectList(new string[] { "Mr", "Mrs", "Miss", "Ms", "Dr", "Sir" });
        Countries = new SelectList(countries.Select(q => q.Name));
        Currencies = new SelectList(currencies,"CurrencyCode","FriendlyForm");
    }
}
我的控制器在GET上的编辑操作如下所示:

public class ConsultantRegistrationController : Controller
{
        public IConsultantRegistrationRepository ConsultantRegistrationRepository { get; private set; }
        public ICountryRepository CountryRepository { get; private set; }
    public IEnumerable<ICountry> Countries { get; private set; }

    public ConsultantRegistrationController()
    {
        ConsultantRegistrationRepository = RepositoryFactory.CreateConsultantRegistrationRepository();
        CountryRepository = RepositoryFactory.CreateCountryRepository();

        Countries = CountryRepository.GetCountries().ToArray();
    }


    public ActionResult Edit(Guid id, int sectionIndex)
    {
        IConsultantRegistration consultantRegistration = ConsultantRegistrationRepository.GetConsultantRegistration(id);

        SelectList bankBranchCountriesSelectList = new SelectList(Countries, "BankBranchCountry", "CountryName", consultantRegistration.BankBranchCountry);
        ViewData["bankBranchCountrySelectList"] = bankBranchCountriesSelectList;

        return View(new ConsultantRegistrationFormViewModel(consultantRegistration,sectionIndex,  Countries,Currencies));
    }
}
(我的LINQ到SQL类型咨询注册已实现IConsultantRegistration)

但是,它似乎试图绑定到错误的类型

如果我在视图中使用此选项(并使用控制器的Countries属性):


我很好地获得了保存的值,但是我的模型在发布时没有更新

如果我在我的观点中使用这个:

        <%: Html.DropDownListFor(model=>model.ConsultantRegistration.BankBranchCountry ",Model.Countries,"(select a Country)") %>
                <%: Html.DropDownList("bankBranchCountrySelectList", ViewData["bankBranchCountrySelectList"] as SelectList)%>
model.ConsultantRegistration.BankBranchCountry”,model.Countries,“(选择一个国家)”)%>
我得到列表,它会将所选值发回,但不会在视图上预先选择模型中当前选定的项目

所以,我有一点解决方案遍布各地,但不是所有在一个地方


希望你能帮我补充一下我的无知。

这篇文章是用多选列表写的,但原则同样适用于单选下拉列表:


这篇文章考虑到了多选列表,但原则同样适用于单选下拉列表:


好的,我解决了它。很有技巧,但它完成了任务

我正在视图中使用ViewData:

        <%: Html.DropDownListFor(model=>model.ConsultantRegistration.BankBranchCountry ",Model.Countries,"(select a Country)") %>
                <%: Html.DropDownList("bankBranchCountrySelectList", ViewData["bankBranchCountrySelectList"] as SelectList)%>

在我的控制器中包含以下内容:

        public ActionResult Edit(Guid id, int sectionIndex)
        {
            IConsultantRegistration consultantRegistration = ConsultantRegistrationRepository.GetConsultantRegistration(id);

            ViewData["bankBranchCountrySelectList"] = Countries.Select(q => new SelectListItem() { Text = q.Name, Value = q.Name, Selected = (q.Name.Trim().Equals(consultantRegistration.BankBranchCountry, StringComparison.InvariantCultureIgnoreCase)) }); // bankBranchCountriesSelectList;

            return View(new ConsultantRegistrationFormViewModel(consultantRegistration,sectionIndex,  Countries,Currencies));
        }



        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(Guid id, int sectionIndex, FormCollection formValues)
        {
            IConsultantRegistration consultantRegistration = ConsultantRegistrationRepository.GetConsultantRegistration(id); 

            UpdateModel(consultantRegistration);
                    ViewData["bankBranchCountrySelectList"] = Countries.Select(q => new SelectListItem() { Text = q.Name, Value = q.Name, Selected = (q.Name.Trim().Equals(consultantRegistration.BankBranchCountry, StringComparison.InvariantCultureIgnoreCase)) });

            IEnumerable<RuleViolation> ruleViolations = consultantRegistration.GetRuleViolations(sectionIndex);
            if (ruleViolations.Count() == 0)
            {

// ...
            }
            else
            {
                ModelState.AddRuleViolations(ruleViolations);
                return View(new ConsultantRegistrationFormViewModel(consultantRegistration, sectionIndex, Countries, Currencies));
            }


    }
公共操作结果编辑(Guid id,int sectionIndex) { IConsultantRegistration consultantRegistration=consultantRegistration repository.GetConsultantRegistration(id); ViewData[“bankBranchCountrySelectList”]=Countries.Select(q=>new SelectListItem(){Text=q.Name,Value=q.Name,Selected=(q.Name.Trim().Equals(consultantRegistration.BankBranchCountry,StringComparison.InvariantCultureIgnoreCase));//BankBranchCountriesSelect列表; 返回视图(新的ConsultantRegistrationFormViewModel(consultantRegistration、部门索引、国家/地区、货币)); } [接受动词(HttpVerbs.Post)] 公共操作结果编辑(Guid id、int sectionIndex、FormCollection formValues) { IConsultantRegistration consultantRegistration=consultantRegistration repository.GetConsultantRegistration(id); 更新模型(咨询注册); ViewData[“bankBranchCountrySelectList”]=Countries.Select(q=>new SelectListItem(){Text=q.Name,Value=q.Name,Selected=(q.Name.Trim().Equals(consultantRegistration.BankBranchCountry,StringComparison.InvariantCultureIgnoreCase)); IEnumerable ruleViolations=consultantRegistration.GetRuleViolations(sectionIndex); if(ruleinflictions.Count()==0) { // ... } 其他的 { ModelState.AddRuleViolations(ruleViolations); 返回视图(新的ConsultantRegistrationFormViewModel(consultantRegistration、部门索引、国家/地区、货币)); } }
不是很理想,而且破坏了干净的编码。不知道为什么它能工作,但这似乎就是MVC“约定高于配置”的全部内容。

好的,我解决了它。适当的黑客,但它完成了任务

我正在视图中使用ViewData:

        <%: Html.DropDownListFor(model=>model.ConsultantRegistration.BankBranchCountry ",Model.Countries,"(select a Country)") %>
                <%: Html.DropDownList("bankBranchCountrySelectList", ViewData["bankBranchCountrySelectList"] as SelectList)%>

在我的控制器中包含以下内容:

        public ActionResult Edit(Guid id, int sectionIndex)
        {
            IConsultantRegistration consultantRegistration = ConsultantRegistrationRepository.GetConsultantRegistration(id);

            ViewData["bankBranchCountrySelectList"] = Countries.Select(q => new SelectListItem() { Text = q.Name, Value = q.Name, Selected = (q.Name.Trim().Equals(consultantRegistration.BankBranchCountry, StringComparison.InvariantCultureIgnoreCase)) }); // bankBranchCountriesSelectList;

            return View(new ConsultantRegistrationFormViewModel(consultantRegistration,sectionIndex,  Countries,Currencies));
        }



        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(Guid id, int sectionIndex, FormCollection formValues)
        {
            IConsultantRegistration consultantRegistration = ConsultantRegistrationRepository.GetConsultantRegistration(id); 

            UpdateModel(consultantRegistration);
                    ViewData["bankBranchCountrySelectList"] = Countries.Select(q => new SelectListItem() { Text = q.Name, Value = q.Name, Selected = (q.Name.Trim().Equals(consultantRegistration.BankBranchCountry, StringComparison.InvariantCultureIgnoreCase)) });

            IEnumerable<RuleViolation> ruleViolations = consultantRegistration.GetRuleViolations(sectionIndex);
            if (ruleViolations.Count() == 0)
            {

// ...
            }
            else
            {
                ModelState.AddRuleViolations(ruleViolations);
                return View(new ConsultantRegistrationFormViewModel(consultantRegistration, sectionIndex, Countries, Currencies));
            }


    }
公共操作结果编辑(Guid id,int sectionIndex) { IConsultantRegistration consultantRegistration=consultantRegistration repository.GetConsultantRegistration(id); ViewData[“bankBranchCountrySelectList”]=Countries.Select(q=>new SelectListItem(){Text=q.Name,Value=q.Name,Selected=(q.Name.Trim().Equals(consultantRegistration.BankBranchCountry,StringComparison.InvariantCultureIgnoreCase));//BankBranchCountriesSelect列表; 返回视图(新的ConsultantRegistrationFormViewModel(consultantRegistration、部门索引、国家/地区、货币)); } [接受动词(HttpVerbs.Post)] 公共操作结果编辑(Guid id、int sectionIndex、FormCollection formValues) { IConsultantRegistration consultantRegistration=consultantRegistration repository.GetConsultantRegistration(id); 更新模型(咨询注册); ViewData[“bankBranchCountrySelectList”]=Countries.Select(q=>new SelectListItem(){Text=q.Name,Value=q.Name,Selected=(q.Name.Trim().Equals(consultantRegistration.BankBranchCountry,StringComparison.InvariantCultureIgnoreCase)); IEnumerable ruleViolations=consultantRegistration.GetRuleViolations(sectionIndex); if(ruleinflictions.Count()==0) { // ... } 其他的 { ModelState.AddRuleViolations(ruleViolations); 返回视图(新的ConsultantRegistrationFormViewModel(consultantRegistration、部门索引、国家/地区、货币)); } }
这并不理想,而且破坏了干净的编码。不知道它为什么会起作用,但这似乎就是MVC“约定重于配置”的全部内容。

谢谢你。我自己看起来确实或多或少就是这样做的。所以我担心我还是被卡住了。在你打电话之前,BankBranchCountry肯定有人住过吗?”SelectList BankBranchCountries SelectList=新的SelectList(国家,“BankBranchCountry”,“CountryName”,consultantRegistration.BankBranchCountry);“假设这是我认为的工作方式,