Asp.net mvc DropDownList在ASP.Net MVC中无法100%正常工作
我对如何有效地使用ASP.NET MVC的Html.DropDownList帮助程序感到困惑 背景:我有一个5页的表单,每次单击“下一步”都会将数据保存到表单中。用户可以在节之间来回导航,因此以前的节已经预先填充了以前输入的数据 这适用于文本框。但不是下拉列表。我尝试了很多不同的方法,包括: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
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);“假设这是我认为的工作方式,