【问题标题】:how to retain value in dropdown after postback in MVC如何在 MVC 中回发后在下拉列表中保留值
【发布时间】:2014-05-16 10:29:13
【问题描述】:

我在 ma 应用程序中有一个 db 驱动的下拉列表,我从中选择一个值并显示与所选选项关联的数据。我这样做了,他的页面重新加载并显示了关联的数据,但下拉列表的值更改为初始值,并且不保留所选值。我在下面给出了ma代码,请帮助我。

我的控制器操作:FilterCandidatesStatus() 是我使下拉菜单起作用的地方,索引操作是针对页面 dat 具有下拉列表和显示值的同一页面

[HttpGet]
    public ActionResult Index(int? page, int? filter)
    {
        ViewBag.statusName = db.CandidateStatuses.ToList();
        int pageSize = 12;
        int pageNumber = (page ?? 1);
        var candidates = new List<Candidate>();

        if (filter != null)
        {
            ViewBag.Filter = filter;
            candidates = db.Candidates.Where(m => m.CandidateStatusID == filter).OrderByDescending(m => m.CandidateID).ToList();
        }
        else
        {
            candidates = db.Candidates.OrderByDescending(m => m.CandidateID).ToList();
        }


        return View(candidates.ToPagedList(pageNumber, pageSize));
    }

    [HttpGet]
    public ActionResult FilterCandidateByStatus(int candidateStatusID)
    {

        return RedirectToAction("Index", new { filter = candidateStatusID });
    }

查看:

function fnFilterCandidtates()
 {
      window.location = "@Url.Action("FilterCandidateByStatus", "NewCandidate")?      candidateStatusID=" + $("#ddlStatus").val();
}
 <select class="h3c1" style=" height:31px; width:115px;" name="list" id="ddlStatus" onchange="fnFilterCandidtates(this)">
    <option value="" disabled selected>Select Status</option>
    @{
        foreach (var lstItem in (IEnumerable<Recruitment_System.Entities.CandidateStatus>)@ViewBag.statusName)
        {
            <option value="@lstItem.CandidateStatusID">@lstItem.StatusName</option>
        }
    }
</select>

我只给出了与下拉菜单相关的代码。请帮帮我。

【问题讨论】:

    标签: database asp.net-mvc-4 drop-down-menu


    【解决方案1】:

    您可以像这样将其存储在 TempData 中,而不是存储在 ViewBag 中:

    TempData["Candidates"] = candidates;
    

    在 View 中阅读后这样做,因此它会保留在 TempData 中,否则它将在第一次阅读后从 TempData 中删除,请在 View 中这样做:

    @{
    IEnumerable<Recruitment_System.Entities.CandidateStatus> candidates = (IEnumerable<Recruitment_System.Entities.CandidateStatus>)TempData["Candidates"]
    
    TempData.Keep("Candidates")
    
    }
    

    在您的操作中也以同样的方式,您必须坚持使用 Keep in TempData

    【讨论】:

    • 很抱歉看到您编辑的代码。我有一些疑问,我不应该在 ma Index conroller 和视图中使用 viewbag 吗?您可以更新整个代码并进行更改吗?请。我不清楚。
    • 您必须使用密钥而不是查看包将候选者存储在 TempData 中,并在视图中从 TempData 中读取它并通过调用 TempData.Keep() 将其保存在 Temp 中,当页面重新加载时 Dropdown 将是从 TempData["Candidates"] 填充
    【解决方案2】:

    如果您有兴趣通过强类型视图进行操作,以防万一

    试试这个 //我的解决方法示例,您可以在您的场景中使用

    public ActionResult Index()
            {
                LeadSortModel lsm = new LeadSortModel(); // model class 
                var SoucreList = //Pass you list to this 
                List<SelectListItem> lobj = new List<SelectListItem>();
                foreach (var item in SoucreList)
                {
                    lobj.Add(new SelectListItem { Text = item.Lead_Source_Name , Value = item.Lead_Source_Name }); //here i taken text,value same becoz i want on select of text the thing what i selected should be saved not the id we usually :)
                }
                lsm.lead_sources = lobj; //leadsources will be present in Models like (public List<SelectedListItem> leadsources ;) . Here you are loading data to model and passing the entire model to make it strongly typed 
    
                return View(lsm); // return the model to view on initial load @HttpGET
    
            }
    

    如果您在 HTTPPOST 时在视图中加载 DDL,则稍后发布,只需使用上述 foreach 循环传递模型..

    问候

    【讨论】:

      【解决方案3】:

      我明白了,您将选定的下拉值发送到 FilterCandidateByStatus 并从那里发送到 Index。然后你把那个值给ViewBag.Filter。因此,您可以在视图中使用该值:

      @{
         int selectedValue = 0;
         if(ViewBag.Filter != null) { selectedValue = (int)ViewBag.Filter; }
      }
      
      function fnFilterCandidtates()
      {
            window.location = "@Url.Action("FilterCandidateByStatus", "NewCandidate")?      candidateStatusID=" + $("#ddlStatus").val();
      }
      <select class="h3c1" style=" height:31px; width:115px;" name="list" id="ddlStatus" onchange="fnFilterCandidtates(this)">
      <option value="" disabled selected>Select Status</option>
          @{
              foreach (var lstItem in (IEnumerable<Recruitment_System.Entities.CandidateStatus>)@ViewBag.statusName)
              {
                  if(CandidateStatusID == selectedValue)
                  {
                     <option value="@lstItem.CandidateStatusID" selected>@lstItem.StatusName</option>
                  }
                  else
                  {
                     <option value="@lstItem.CandidateStatusID">@lstItem.StatusName</option>
                  }
              }
          }
      </select>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        相关资源
        最近更新 更多