2016-12-25 108 views
0

美好的一天!我对ASP.NET很陌生,并试图研究多个教程,并会非常感谢这个社区的反馈。ASP.NET MVC 5 - 从另一个模型Dropdownlist

我想从另一个模型构建级联下拉列表。在使用过程中,我创建一个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,它仍然不符合。我会很感激你对此的反馈!

回答

0

改变这一行

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

对此

public virtual string DistrictName { get; set; } 

OR

更改您的代码如下

型号

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" /> 
} 
+0

确实谢谢你,这工作! – moka

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" /> 
} 
+0

shyju嗨,真是太感谢您对级联的修正,解决没有工作“为的SelectList”,其示值误差,当我添加它。 – moka

+0

错误是什么?只要您的操作方法按照问题中所示设置ViewBag.DistrictNameList,代码应该工作。 – Shyju

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"); 
      } 

感谢所有的答复!

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" /> 
}