代码之家  ›  专栏  ›  技术社区  ›  Program.X

DropDownList在ASP.NETMVC中不能100%工作

  •  1
  • Program.X  · 技术社区  · 16 年前

    背景:

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

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

    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");
        }
    }
    

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

            <%: Html.DropDownList("ConsultantRegistration.BankBranchCountry",ViewData["bankBranchCountrySelectList"] as SelectList) %>
    

    这给了我一个错误:

    不包含具有 名称“BankBranchCountry”。

    请看一下这个属性的模式:

    public interface IConsultantRegistration
    {
        Guid ID { get; set; }
    
    
        [DisplayName("Branch Country")]
        string BankBranchCountry { get; set; }
    
    }
    

    (我的LINQ到SQL类型ConsultantRegistration已实现IConsultantRegistration)

    不过,它似乎试图绑定到错误的类型?

            <%: Html.DropDownList("ConsultantRegistration.BankBranchCountry ",Model.Countries,"(select a Country)") %>
    

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

    如果我用这个观点:

            <%: Html.DropDownListFor(model=>model.ConsultantRegistration.BankBranchCountry ",Model.Countries,"(select a Country)") %>
    

    我得到这个列表,它会将所选的值发回,但不会在视图中预先选择模型中当前所选的项。

    希望你能帮我弥补我的无知。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Program.X    16 年前

    我正在视图中使用ViewData:

                    <%: 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));
                }
    
    
        }
    

    不理想,破坏干净的编码。不知道它为什么能工作,但这似乎就是MVC在“约定重于配置”方面的意义所在。

        2
  •  0
  •   Fenton    16 年前

    本文在编写时考虑了多选列表,但这一原则同样适用于单选下拉列表:

    http://www.stevefenton.co.uk/Content/Blog/Date/201002/Blog/How-To-Handle-Multiple-Select-Lists-In-ASP-NET-MVC/