我的模型中有一个属性,如下所示:
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。我知道有十个类似的问题,但没有一个有用。
答案 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>
,AllCreditCards
为IList<SelectListItem>
。
所以,这是正确的方法。