C# 为什么mvc中我的下拉列表中的项目不被标记为选中?

C# 为什么mvc中我的下拉列表中的项目不被标记为选中?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我使用SelectList从各个型号填充以下下拉列表 <div class="editor-field"> @Html.DropDownList("Companies", Model.Companies) </div> <div class="editor-label"> @Html.LabelFor(model => model.Role, "User Role") </div> <div class="editor-

我使用SelectList从各个型号填充以下下拉列表

<div class="editor-field">
    @Html.DropDownList("Companies", Model.Companies)
</div>
<div class="editor-label">
    @Html.LabelFor(model => model.Role, "User Role")
</div>
<div class="editor-field">
    @Html.DropDownList("Roles", Model.Roles)
</div>
我手动写入了预先选择的默认值

我的问题是,我似乎无法让选中的标志移到我正在选择的项目。同样地,当要发布到控制器时,这些字段的选定值将变为空并引发异常

如何让DropDownlist接受我的选择,并在ajax帖子中与表单的其余部分一起发送数据

编辑

这是我的[HttpPost]Add ActionResult它有点混乱,但这只是我的一些讨厌的数据设计,我稍后会解决

[HttpPost]
public ActionResult Add(UserModel model)
{
  // this check fails saying that Companies and Roles don't have values
  if (ModelState.IsValid)
  {
    try
    {
      // these fields are for auditing
      model.CreatedBy = String.Format("{0} {1}", Convert.ToString(Session["firstname"]), Convert.ToString(Session["lastname"]));
      model.CreatedOn = DateTime.Now;
      // get the selected values from the dropdownlists
      Int64 companyid = Convert.ToInt64(model.Companies.Single(x => x.Selected).Value);
      Int64 role = Convert.ToInt64(model.Roles.Single(x => x.Selected).Value);   
      // the UserModel accepts a User object to add to the database,
      // so copy the model's values over to the user object for adding.
      // this is a lot of the mess which will be cleaned up later
      User u = new User();
      WebCompany c = new WebCompany();
      WebRole r = new WebRole();
      u.Company = c.GetCompanyById(companyid);
      u.Role = r.GetRoleById(role);
      u.CreatedBy = model.CreatedBy;
      u.CreatedOn = model.CreatedOn;
      u.EmailAddress = model.EmailAddress;
      u.FirstName = model.FirstName;
      u.LastName = model.LastName;
      u.LastLogin = model.LastLogin;
      u.Password = model.Password;
      model.Add(u);
      return Json(new
      {
        Message = "Success",
        IsOK = bool.TrueString
      });
    }
    catch (Exception ex)
    {
      if (Request.IsAjaxRequest())
      {
        return ThrowError(ex, "Add");
      }
      else
      {
        return View("Index");
      }
    }
  }
  else
  {
    // return a Json that contains information about why the model is invalid
  }
}
编辑2

这是模型。这里使用了相当多的继承来提供来自我正在编写的框架的通用用户值、电子邮件地址、密码

注意:在我尝试实现dropdownlists之前,这一切都很好

UserModel:为MVC提供对用户对象的访问,并包括CRUD函数

public class UserModel : User
{
    public List<SelectListItem> Companies { get; set; }
    public List<SelectListItem> Roles { get; set; }

    // CRUDs go here
}
BaseUser:提供用户公用字段电子邮件地址、密码

public abstract class BaseUser : BaseObject
{
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public BaseUser()
    {
        EmailAddress = String.Empty;
        Password = String.Empty;
        FirstName = String.Empty;
        LastName = String.Empty;
    }        
}
BaseObject:为数据库表主键、审核提供全局公共字段

public abstract class BaseObject
{
    [Key]
    public Int64 PKey { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public string ModifiedBy { get; set; }
    public DateTime ModifiedOn { get; set; }

    public BaseObject()
    {
        CreatedBy = "System";
        CreatedOn = DateTime.Now;

        ModifiedBy = "System";
        ModifiedOn = DateTime.Now;
    }
}

在这种情况下,我总是使用for helper

@Html.DropDownListFor(x => x.selectedCompany, Model.Companies)
要预先设置选定的公司,只需在控制器上设置selectedCompany

model.selectedCompany = //the users previous selection

这也会将用户所做的选择绑定到您的模型,因此,如果下拉列表发生更改,selectedCompany的值将设置为在视图上更改为的值。

只是默认选择-即在渲染视图时。它不会因为您选择了另一项而更改。要在jquery中获取当前选定的值,请使用$'ddlRoles'.val;可以,但我如何将用户选择的项目传达给控制器?您需要发布发布到的方法的签名和用于发布的ajax代码。您似乎没有绑定到任何模型属性,因此很难确定您在做什么。我在某处看到,更改s的名称将有助于选择问题,但它没有。。。这些映射到模型中的列表属性。仅更改select的名称可确保绑定失败。你也应该发布模型。
public abstract class BaseObject
{
    [Key]
    public Int64 PKey { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public string ModifiedBy { get; set; }
    public DateTime ModifiedOn { get; set; }

    public BaseObject()
    {
        CreatedBy = "System";
        CreatedOn = DateTime.Now;

        ModifiedBy = "System";
        ModifiedOn = DateTime.Now;
    }
}
@Html.DropDownListFor(x => x.selectedCompany, Model.Companies)
model.selectedCompany = //the users previous selection