代码之家  ›  专栏  ›  技术社区  ›  Puneet Verma

MVC下拉列表问题

  •  0
  • Puneet Verma  · 技术社区  · 7 年前

    MVC中的下拉列表问题

    MVC新手我对MVC中的下拉列表有问题,你能帮我吗

    下面是我用于从DB获取数据的代码

    public static List<AppDetailsDTO> GetAllApplications()
    {
        string[] arrRoles = new string[] { };
        List<AppDetailsDTO> lstAppDetails = new List<AppDetailsDTO>();
        using (ApplicationSecurityContext objSecurityContext = new ApplicationSecurityContext())
        {
        var appDetails = objSecurityContext.Applications.Select(app => new AppDetailsDTO() { AppId= app.id, AppName= app.name }).Distinct().ToList();
        if (appDetails.Count() > 0)
         {
            lstAppDetails = appDetails;
         }
        }
    return lstAppDetails;   
    }
    

    AppDetailsDTO类如下所示

    public class AppDetailsDTO
    {
        public int AppId { get; set; }
        public string AppName { get; set; }
    }
    

    视图中使用的ViewModel如下所示

    public class ClientApplicationViewModel
    {
        public string selectedAppID;
        public SelectList AppSelectionList { get; set; }
    }
    

    控制器代码如下

    [HttpGet]
    public ActionResult AssignApplication()
    {
        List<AppDetailsDTO> lstAvailableApps = new List<AppDetailsDTO>();
        lstAvailableApps = SecurityDAL.GetAllApplications();
        ClientApplicationViewModel objModel = new ClientApplicationViewModel();
        objModel.AppSelectionList = new SelectList(lstAvailableApps, "AppId", "AppName");
        return View(objModel);
    }
    
    [HttpPost]
    public void AssignApplication(ClientApplicationViewModel model)
    {
        string id = model.selectedAppID.ToString();
    }
    

    我在视图中使用如下

    @model MVCWINDOWSAUTHENTICATION.Models.ClientApplicationViewModel
    @{
    ViewBag.Title = "AssignApplication";
    }
    
    <h2>AssignApplication</h2>
    
    @using (Html.BeginForm()) 
    {
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
    <h4>ClientApplicationViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
    <div class="col-md-offset-2 col-md-10">
    @Html.DropDownListFor(model => model.selectedAppID, Model.AppSelectionList, "Select Application")
    </div>
    </div>
    <div class="form-group">
    <div class="col-md-offset-2 col-md-10">
    <input type="submit" value="Create" class="btn btn-default" />
    </div>
    </div>
    </div>
    }
    <div>
    @Html.ActionLink("Back to List", "Index")
    </div>
    

    我正在获取下拉列表的问题正在填充,但当我发布表单时,它会被发布并进入控制器post方法,但在控制器中,但selectedAppID和AppSelectionList为null。

    请帮助我,让我知道我在这方面犯了什么错误。

    感谢您在这方面的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter B    7 年前

    为了使MVC模型绑定能够工作,您想从表单发布中自动绑定的所有项都必须 属性 :

    public class ClientApplicationViewModel
    {
        public string selectedAppID { get; set; }  // <-- add this
    }
    

    另一方面,如 通常不属于模型的一部分,因为它们永远不应该被发回控制器。模型应仅包含用户选择或输入的值,而不是可能值的列表。此类“助手”列表通常使用中的值从控制器发送到视图 ViewBag .

    应用程序选择列表 从模型中。然后,控制器中的代码变为:

    ViewBag.AppSelectionList = new SelectList(lstAvailableApps, "AppId", "AppName");
    

    在视图中使用:

    @Html.DropDownListFor(model => model.selectedAppID, ViewBag.AppSelectionList, "Select Application")
    

    最后,如果您想在两种情况下(即GET和POST)填充列表,那么ViewBag初始化代码应该是 二者都 行动方法。