【问题标题】:Issue with Drop Down list in MVCMVC 中的下拉列表问题
【发布时间】:2017-10-09 13:38:08
【问题描述】:

MVC 中的下拉列表问题

MVC 新手我遇到了 MVC 中的下拉列表的问题,您能帮我解决一下吗

下面是我用来从数据库中获取数据的代码

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>

我得到下拉列表的问题正在被填充,但是当我发布表单时,它被发布并进入控制器发布方法但在控制器中,但 selectedAppID 和 AppSelectionList 为空。

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

感谢您在这方面的帮助。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 html.dropdownlistfor


    【解决方案1】:

    要使 MVC 模型绑定起作用,您希望从表单发布自动绑定的所有项目都必须是 属性

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

    另外说明,AppSelectionList 等列表通常不是模型的一部分,因为它们不应该被发回控制器。模型应该只包含用户选择或输入的值,而不是可能值的列表。这种“帮助”列表通常使用 ViewBag 中的值从控制器发送到视图。

    所以请从模型中删除 AppSelectionList。 Controller中的代码就变成了这样:

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

    在视图中使用这个:

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

    最后,如果您想在两种情况下(即 GET 和 POST)都填充列表,那么 ViewBag 初始化代码应该是 both 操作方法的一部分。

    【讨论】:

    • Peter 感谢您指出我犯的错误,我将其更改为属性。我能够获取所选 App 的值,但 AppSelectionList 仍然显示为 null 。你能告诉我这是为什么吗
    • 请看我的更新。这几乎是一个单独的问题,但尽管如此。
    • 感谢彼得的更新,让事情变得更好。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多