ASP.NET MVC 5 - 来自其他模型的下拉列表

时间:2016-12-25 23:48:25

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

美好的一天!我是ASP.NET的新手,并尝试研究多个教程,非常感谢社区的反馈。

我正在尝试从另一个模型构建级联下拉列表。在课程中,我创建了一个CombinedModel

模型 - 视图

//Combined model
namespace WebApplication2.Models
{
public class CombinedModel
{
    public RegisterViewModel RegisterViewModel { get; set; }
    public DistrictModel Districtmodel { get; set; }
}
}


    //Model 1
    public class RegisterViewModel
    {
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    public string ConfirmPassword { get; set; }

    public virtual List<DistrictModel> DistrictName { get; set; }

 //Model 2
 namespace WebApplication2.Models
 {
public class DistrictModel
 {
    public int DistrictID { get; set; }
    public string DistrictName { get; set; }
 }
 }

控制器-视图

    public ActionResult Register()
    {
        ViewBag.DistrictNameList = new SelectList(db.DistrictModel,               "DistrictName", "DistrictName");
        return View();
    }

查看

     model WebApplication2.Models.CombinedModel
     using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
       <div class="col-md-10">

     Html.DropDownListFor(m => m.RegisterViewModel.DistrictName, ViewBag.DistrictNameList, new { @class = "form-control" } )
    </div>

它似乎不起作用......我尝试将其更改为Enum,但它仍然不符合。非常感谢您对此的反馈!

4 个答案:

答案 0 :(得分:0)

您的问题没有关于任何级联下拉菜单的任何代码!但我发现您的代码存在问题,无法呈现下拉列表。

您需要将viewBag项目转换为SelectList因为DropDownListFor重载需要,而不是动态对象!

@using (Html.BeginForm("Index", "home", FormMethod.Post,
                                      new { @class = "form-horizontal", role = "form" }))
{
    @Html.DropDownListFor(m => m.RegisterViewModel.DistrictName, 
                 ViewBag.DistrictNameList as SelectList, new { @class = "form-control" })
    <input type="submit" />
}

答案 1 :(得分:0)

更改此行

public virtual List<DistrictModel> DistrictName { get; set; }

到此

public virtual string DistrictName { get; set; }

更改您的代码如下

<强>模型

public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        public string ConfirmPassword { get; set; }

        public virtual string DistrictName { get; set; }

        public virtual SelectList DistrictList { get; set; }

    }
    public class DistrictModel
    {
        public int DistrictID { get; set; }
        public string DistrictName { get; set; }
    }

    public class CombinedModel
    {
        public RegisterViewModel RegisterViewModel { get; set; }
        public DistrictModel Districtmodel { get; set; }
    }

<强>控制器

        CombinedModel obj = new CombinedModel();
        obj.RegisterViewModel = new RegisterViewModel();;
        obj.RegisterViewModel.DistrictList = new SelectList(db.DistrictModel, "DistrictName", "DistrictName");;
        return View(obj);

查看

@using (Html.BeginForm("Index", "home", FormMethod.Post,
                                      new { @class = "form-horizontal", role = "form" }))
{
    @Html.DropDownListFor(model => model.RegisterViewModel.DistrictName, Model.RegisterViewModel.DistrictList, new { @class = "form-control" })
    <input type="submit" />
}

答案 2 :(得分:0)

感谢所有的回复,我想发布最终的解决方法并与所有人分享。问题是我没有正确设置模型。我还必须在Get / Post中添加视图包并在视图中更改为dropdownlist。

<强> 模型

 public class AssetRequest
    {
        public int Id { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "Request date")]
        public DateTime AssetRequestDate { get; set; }



        [Display(Name = "Facility")]
        public int FacilityId { get; set; }
        public virtual Facility Facility { get; set; }

 public class Facility
    {
        public int Id { get; set; }


        [Display(Name="Asset")]
        public string AssetName { get; set; }

        public virtual ICollection<AssetRequest> AssetRequests { get; set; }
    }

public DbSet<AssetRequest> AssetRequestTable { get; set; }
        public DbSet<Asset> AssetTable { get; set; }

        public DbSet<District> DistrictTable { get; set; }

<强>控制器

 // GET: AssetRequests/Create
        public ActionResult Create()
        {

            ViewBag.RequestStatusId = "New request";
            ViewBag.AssetRequestDate = DateTime.Now;
            ViewBag.AssetId = new SelectList(db.AssetTable, "Id", "AssetName");
            ViewBag.DistrictId = new SelectList(db.FacilitytTable, "Id", "DistrictName");
            ViewBag.RequestTypeId = new SelectList(db.RequestTypeTable, "Id", "RequestTypeName");
            return View();
        }


[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include = "Id,AssetRequestDate,FacilityId,AssetId,RequestTypeId, RequestStatusId")] AssetRequest assetRequest)
        {
            var currentUser = await manager.FindByIdAsync(User.Identity.GetUserId());

            if (ModelState.IsValid)
            {
                assetRequest.User = currentUser;
                assetRequest.AssetRequestDate = DateTime.Now;
                assetRequest.RequestStatusId = 1;
                db.AssetRequestTable.Add(assetRequest);
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

感谢所有回复!

答案 3 :(得分:0)

确定

区域模型

 public class DistrictModel
 {
    public int Id { get; set; }
    public string DistrictName { get; set; }
 }

RegisterViewModel

public class RegisterViewModel
{
  [DataType(DataType.Password)]
  [Display(Name = "Confirm password")]
  public string ConfirmPassword { get; set; }

  //Mapping 
  public int DistrictId { get; set; }
  public virtual List<DistrictModel> District { get; set; }
}

在控制器级别

 public ActionResult Register()
 {
    List<DistrictModel> districtModelList = db.DistrictModel.ToList();
    ViewData["DistrictNameList"] = districtModelList.Select(x => new SelectListItem { Value = x.Id , Text = x.DistrictName  });
    return View();
 }  

在视图

model RegisterViewModel
@using (Html.BeginForm("Index", "home", FormMethod.Post,
                                  new { @class = "form-horizontal", role = "form" }))
{
  @Html.DropDownListFor(model => model.DistrictId, (IEnumerable<SelectListItem>)ViewData["DistrictNameList"], "[Select District]", new { @class = "form-control" })
  <input type="submit" />
}