【问题标题】:How to save selected DropDownList value in ASP.NET MVC model for POST?如何在 ASP.NET MVC 模型中为 POST 保存选定的 DropDownList 值?
【发布时间】:2013-07-09 18:09:18
【问题描述】:

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

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

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

另外,在我看来是@Html.DropDownListFor(m=&gt;m.AllCards,Model.AllCards,"--Select--")。 发布视图期间出现问题。也就是说,onSubmit 我的Model.AllCards 是空的,尽管在下拉列表中选择了一个值。 我尝试像这样向模型添加一个新属性:

public SelectListItem SelectedCard

然后像这样改变视图:

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

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

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

附:我知道有十个类似的问题,但没有一个有帮助。

【问题讨论】:

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


    【解决方案1】:

    这就是我会做的。

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

    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>
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      为您的模型添加与SelectListItemsvalue 参数相同类型的另一个属性。例如,如果是int,请执行以下操作:

      public int SelectedCard { get; set; }
      

      然后,像这样更改您的DropDownListFor

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

      我不确定您为什么使用IList&lt;SelectListItem&gt; 而不是简单地使用SelectList。如果你做后者,那么你不需要上面的new SelectList构造函数调用。

      【讨论】:

        【解决方案3】:

        您没有正确使用 DropDownListFor:

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

        在您的模型中:

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

        【讨论】:

        • 我认为上面应该是 m.SelectedCard 而不是 m.Model.SelectedCard。
        【解决方案4】:

        这是解决方案,AJ 帮了我很大的忙,非常感谢:

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

        其中ChosenCardIEnumerable&lt;SelectListItem&gt; 类型,AllCreditCardsIList&lt;SelectListItem&gt;

        所以,这是正确的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          • 2013-08-03
          • 2014-01-11
          • 2013-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多