我有两个多对多的课程,第一个是“Anuncios”,第二个是“SubCategorias”
public class Anuncios {
public int AnuncioId {get;set;}
public string Titulo {get;set;}
public ICollection<SubCategorias> SubCategorias {get;set;}
}
public class SubCategorias {
public int SubCategoriaId {get;set;}
public string Nome {get;set;}
public ICollection<Anuncios> Anuncios {get;set;}
}
在DAL层,我做了将“Anuncio”保存在DB中的方法。
public void Salvar(Anuncio entidade) {
entidade.SubCategorias = entidade.SubCategorias.Select(subcat => _contexto.SubCategorias.FirstOrDefault(x => x.SubCategoriaId == subcat.SubCategoriaId)).ToList();
_contexto.Anuncios.Add(entidade);
_contexto.SaveChanges();
}
我创建动作“创建”:
private readonly Context _ctx = new Context();
public ActionResult Create()
{
var model = new Anuncios {SubCategorias = _ctx.SubCategorias.ToList()};
return View(model);
}
在视图中,我使用“SubCategorias”创建DropDownList:
@Html.LabelFor(model => model.SubCategorias)
@Html.DropDownListFor(model => model.SubCategorias, new SelectList(Model.SubCategorias, "SubCategoriaId", "Nome"))
DropDownListFor填充了成功..
精细....
但是当提交表单时,DropDownList中选择的值不会传递给方法Create。 anuncio.SubCategorias为null!
private readonly AnunciosDal _anuncio = new AnunciosDal();
[HttpPost]
public ActionResult Create(Anuncio anuncio)
{
_anuncio.Salvar(anuncio);
return View(anuncio);
}
我在各种论坛中寻求解决方案,但找不到
有人帮助我吗?!
抱歉我的英文...
谢谢! FabrícioOliveira
答案 0 :(得分:4)
DropDownListFor的第一个参数需要是保存所选值的对象,其中第二个参数包含列表:
@Html.DropDownListFor(model => model.SOME_ID_FOR_SELECTED_VALUE,
new SelectList(Model.SubCategorias, "SubCategoriaId", "Nome"))
目前,您还将示例映射为与第一个属性相同的列表。你应该使用像@Maess建议的ID,然后通过:
绑定它@Html.DropDownListFor(model => model.SubCategoriaID, new SelectList(Model.SubCategorias, "SubCategoriaId", "Nome"))
然后选择一个值,然后将其发回服务器到此SubCategoriaID字段。
答案 1 :(得分:1)
您需要拥有另一个属性来存储下拉列表中的选定值。最好是创建一个视图模型,其中包含视图所需的属性。
public class CreateAnuncios
{
public string Title {set;get;}
public int SelectedSubCategoryId {set;get;}
public List<SelectListItem> SubCategories {set;get;}
public CreateAnuncios()
{
this.SubCategories = new List<SelectListItem>();
}
}
现在,在您的创建操作中,创建此视图模型的对象,填充SubCategories
属性并发送到视图。
public ActionResult Create()
{
var vm=new CreateAnuncios();
vm.SubCategories = ctx.SubCategorias
.Select(s=> new SelectListItem
{ Value = s.SubCategoriaId .ToString(),
Text=s.Nome}).ToList();
return View(vm);
}
您的创建视图应该强烈输入CreateAnuncios类
@model YourNameSpaceHere.CreateAnuncios
@using(Html.Beginform())
{
@Html.TextBoxFor(s=>s.Title)
@Html.DropdownListFor(s=>s.SelectedSubCategoryId,Model.SubCategories,"Select")
<input type="submit" />
}
现在,当用户发布表单时,请阅读已发布模型的属性并使用该属性保存到db。
[HttpPost]
public ActionResult Create(CreateAnuncios model)
{
//Check for model.Title and model.SelectedSubCategoryId and use it to save
// to do :Save and redirect
}
答案 2 :(得分:0)
您需要提供填充DropDownList的SelectListItem集合以及保存当前所选SelectListItems的属性。 Id(将发回服务器):
public class Anuncios {
public int AnuncioId {get;set;}
public string Titulo {get;set;}
public ICollection<SubCategorias> SubCategorias {get;set;}
public int SelectedSubCategoryId {get;set;}
public IEnumerable<SelectListItem> SubCategoryListItems {get;set;}
}
然后,通过以下方式将它们呈现给用户:
@html.DropDownListfor(x => x.SelectedSubCategoryId, Model.SubCategoryListItems)
必须从服务器填充SubCategoryListItems,通常是这样的:
this.SubCategoryListItems = this.SubCategorias.Select(x => new SelectListItem { Text = x.Name, Value = x.Id });
答案 3 :(得分:-1)
您需要在绑定中拥有它的SubCategoria的id属性,但不需要在模型中
public class Anuncios {
public int AnuncioId {get;set;}
public string Titulo {get;set;}
public ICollection<SubCategorias> SubCategorias {get;set;}
public int SubCategoriaId{get;set;}
}