ASP MVC 4:DropDownListFor的请求值

时间:2015-10-28 17:48:09

标签: c# asp.net asp.net-mvc

我有两个多对多的课程,第一个是“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

4 个答案:

答案 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;}
}