我搜索了几个小时(或几天),但还没有找到解决方案。我想使用DropdownListFor编辑一个客户,用于使用正确的预选值进行称呼。
我有3个实体(数据库第一个概念,这不是我自己的设计...):客户,地址,称呼
CUSTOMER有一个address_id(f_key),一个ADDRESS有一个salutation_id(f_key)。例如,ADDRESS包含名字和姓氏。在SALUTATION实体内部有一个列sal1,它包含所有可能的称呼。
现在,我想通过ViewModel编辑我的客户,如下所示:
public class CustomerViewModel
{
public CUSTOMER cust { get; set; }
public SelectList salutationList { get; set; }
CustomerRepository repository = new CustomerRepository();
public CustomerViewModel(int id)
{
cust = repository.GetCustomerByIdAsQueryable(id).Single();
salutationList = new SelectList(repository.GetSalutations(), cust.ADDRESS.SALUTATION.SAL1);
}
// Some more
}
CutsomerRepository方法:
public class CustomerRepository
{
private MyEntities db = new MyEntities();
public IQueryable<CUSTOMER> GetCustomerByIdAsQueryable(int id) {...}
public IQueryable<CUSTOMER> GetCustomersByName(string firstName, string lastName, int maxCount) {...}
public List<string> GetSalutations()
{
var salutationList = new List<string>();
var salutationListQry = from s in db.SALUTATION
select s.SAL1;
salutationListTemp.AddRange(salutationListQry);
return salutationList;
}
// ...
}
这是我的控制器方法:
[HttpPost]
public ActionResult CustomerData(int id, FormCollection fc)
{
var vm = new CustomerViewModel(id);
// Why do I need the following line?
vm.cust = repository.GetCustomerByIdAsQueryable(id).Single();
try
{
UpdateModel(vm, fc);
repository.Save();
return View("CustomerData", vm);
}
catch (Exception e)
{
return View();
}
}
最后是我视图中的部分:
@model WebCRM.ViewModels.CustomerViewModel
@using (Html.BeginForm())
{
// ...
<div class="editor-label">
@Html.Label("Salutation:")
@Html.DropDownListFor(model => model.cust.ADDRESS.SALUTATION.SAL1, Model.salutationList)
// @Html.DropDownList("Salutation", Model.salutationList)
</div>
<div class="editor-label">
</div>
<div class="editor-field">
@Html.Label("Last name:")
@Html.EditorFor(model => model.cust.ADDRESS.LASTNAME)
@Html.ValidationMessageFor(model => model.cust.ADDRESS.LASTNAME)
</div>
<p>
<input type="submit" value="Speichern" />
</p>
}
更改和保存姓氏可以正常工作。但是当保存称呼时,它会将SALUTATION实体中的SAL1值更改为我在DropdownListFor中选择的值。我想要的是为我的客户更改ADDRESS实体内的salutation_id。为什么不起作用?
另一个奇怪的行为:当我在CustomerController中删除标记的行时,我甚至无法更改并保存姓氏。通常,CustimerViewModel的构造函数会设置客户。那么为什么我必须拥有在ViewModel中设置客户的代码行?这是重复的,但必须在那里......
提前致谢。
答案 0 :(得分:1)
您需要在列表中包含Selected属性。
我可以告诉你我的工作实例:
public static IEnumerable<SelectListItem> GetCountries(short? selectedValue)
{
List<SelectListItem> _countries = new List<SelectListItem>();
_countries.Add(new SelectListItem() { Text = "Select country...", Value = "0", Selected = selectedValue == 0 });
foreach (var country in ObjectFactory.GetInstance<DataRepository>().GetCountries())
{
_countries.Add(new SelectListItem()
{
Text = country.Name,
Value = country.ID.ToString(),
Selected = selectedValue > 0 && selectedValue.Equals(country.ID)
});
}
return _countries;
}
在控制器中,我将其存储到viewbag中:
ViewBag.Countries = CompanyModel.GetCountries(0);
在视图中:
@Html.DropDownListFor(m => m.CompanyModel.CountryId, (IEnumerable<SelectListItem>)ViewBag.Countries)