如何在MVC6中获取DropDownListFor的值

时间:2015-01-29 09:08:02

标签: c# razor asp.net-core-mvc

我一直在浏览堆栈以获得答案,我看到了很多不同的方法,但是当我尝试它们时,它们都不起作用。所以也许我在我的代码中做了一些根本错误的事情。

我有一个下拉列表,如下所示:

@Html.DropDownListFor(m => m.PrivilegesGroups.First().Id, new SelectList(Model.PrivilegesGroups, "Id", "Name"), new { id = "PrivilegeGroupIdDDL", @class = "tableInput" })

这是我的模特。

namespace My.Internal.Models {
  public class UserViewModel {
    public User User { get; set; }
    public IEnumerable<PrivilegeGroup> PrivilegesGroups { get; set; }
    public IEnumerable<Company> UserCompanies { get; set; }
  }
}

其中User是具有Id,Name,UsersCompanyId和PrivilegeGroupId的类。

PrivilegeGroup是一个类:Id,Name。

公司是一个类:Id,Name。

我的保存控制器看起来像这样。

    [HttpPost]
    public IActionResult ManageUsers(UserViewModel model) {
        UserDao db = new UserDao();
        User modelToSave = new User();
        db.AddUpdateUser(modelToSave);
        return RedirectToAction("ManageUsers");          
    }

我尝试了不同的方法来获取所选下拉列表项的值,但尚未设法将其返回到UserViewModel中。

非常感谢任何有关如何获取所选项目ID的帮助。

1 个答案:

答案 0 :(得分:0)

你在这里做了两件大事。首先,你不能在这样的表达式中执行函数:

 m => m.PrivilegesGroups.First().Id

在调用表达式之前,您必须执行。要么向ViewModel添加一个变量以包含它的结果,要么将该方法执行到视图中的局部变量中(不是真的推荐,但它会起作用)

另一个问题是你要覆盖id:

new { id = "PrivilegeGroupIdDDL", @class = "tableInput" })

这不好,因为你正在剥夺帮助者防止ID冲突的能力。这可能导致无效的HTML和意外结果。

至于回到UserViewModel,您是否正确使用了Html.BeginForm()?

编辑:

要将ID添加到模型中,只需执行以下操作:

public class UserViewModel {
    public User User { get; set; }
    public int PrivelegesId { get; set; }
    public IEnumerable<PrivilegeGroup> PrivilegesGroups { get; set; }
    public IEnumerable<Company> UserCompanies { get; set; }
}

在您的控制器中,执行查询:

model.PrivelegesId = myQuery.PrivelegesGroup.First().Id;

然后在你的DropDownList:

DropDownListFor(m => m.PrivilegesId, 
   new SelectList(Model.PrivilegesGroups, "Id", "Name"), new { @class = "tableInput" })

我不知道您的Controller代码是什么样的,所以我只是想到变量名,但你应该能够弄明白。