如何在ASP.NET MVC模型中为POST保存选定的DropDownList值?

时间:2013-07-09 18:09:19

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor

我的模型中有一个属性,如下所示:

 public IList<SelectListItem> AllCards { get; set; }

控制器使用来自数据库的数据填充SelectListItem属性。

另外,在我的视图中是@Html.DropDownListFor(m=>m.AllCards,Model.AllCards,"--Select--")。 在POST视图期间出现问题。也就是说,onSubmit我的Model.AllCards为空,尽管在下拉列表中选择了一个值。 我尝试将新属性添加到模型中:

public SelectListItem SelectedCard

然后更改视图:

@Html.DropDownListFor(m=>m.AllCards,Model.SelectedCard,"--Select--")

但它给我一个错误,说转换不可能,就像那样。

我应该怎样做才能捕获我的dropdownlist值,以便在调用视图的POST版本后它可以在模型内部? 谢谢

P.S。我知道有十个类似的问题,但没有一个有用。

4 个答案:

答案 0 :(得分:7)

我就是这样做的。

您的视图模型可能如下所示,并且会有一张卡片列表:

public class CardViewModel
{
     public int CardId { get; set; }

     public IEnumerable<Card> Cards { get; set; }
}

我不知道你的卡有哪些属性,但让我发明了自己的属性:

public class Card
{
     public int Id { get; set; }

     public string Name { get; set; }
}

您的视图将接受此视图模型:

@model YourProject.ViewModels.Cards.CardViewModel

您的卡片的HTML标记下拉列表:

@Html.DropDownListFor(
     x => x.CardId,
     new SelectList(Model.Cards, "Id", "Name", Model.CardId),
     "-- Select --",
     new { id = "Cards" }
)
@Html.ValidationMessageFor(x => x.CardId)

第一次加载视图时的操作方法:

public ActionResult YourActionMethod()
{
     CardViewModel viewModel = new CardViewModel
     {
          Cards = cardService.FindAll()
     }

     return View(viewModel);
}

[HttpPost]
public ActionResult YourActionMethod(CardViewModel viewModel)
{
     if (!ModelState.IsValid)
     {
          return View(viewModel);
     }

     // Do what ever you need to do. The selected card's id will now be populated

     return RedirectToAction("List");
}

关于您的JavaScript问题,我建议您开始一个新问题,但我会概述一下您可以注意的问题。通过使用jQuery添加on change事件来分离您的JavaScript和HTML(使用您想要的任何内容)。例如:

<script>

     $(document).ready(function () {
          $("#Cards").change(function () {
               alert('cards value has changed');
          });
     });

</script>

我希望这会有所帮助。

答案 1 :(得分:3)

将另一个属性添加到与value的{​​{1}}参数相同类型的模型中。例如,如果它是SelectListItems,请执行以下操作:

int

然后,像这样更改public int SelectedCard { get; set; }

DropDownListFor

我不确定您为什么使用@Html.DropDownListFor(m => m.SelectedCard, new SelectList(Model.AllCards), "--Select--") 而不是简单地使用IList<SelectListItem>。如果您执行后者,那么您不需要在上面进行SelectList构造函数调用。

答案 2 :(得分:1)

您没有正确使用DropDownListFor:

@Html.DropDownListFor(m=>m.Model.SelectedCard, Model.AllCards,"--Select--")

在你的模特中:

   public SelectList AllCards {get; set;}
   public int SelectedCard {get; set;}

答案 3 :(得分:0)

这是解决方案,AJ帮我提了很多,所以谢谢:

 @Html.DropDownListFor(m => m.ChosenCard, Model.AllCreditCards, "--Select--", new { onchange = "GetOtherItem()" } )

ChosenCard类型为IEnumerable<SelectListItem>AllCreditCardsIList<SelectListItem>

所以,这是正确的方法。