ASP.NET MVC 5 - 从另一个模型Dropdownlist
问题描述:
美好的一天!我对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,它仍然不符合。我会很感激你对此的反馈!
答
改变这一行
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" />
}
答
您的问题没有关于任何级联下拉的任何代码!但是,我发现您的代码存在问题以呈现下拉菜单。
您需要将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" />
}
答
感谢所有的答复,我认为发布最终的解决办法,并与所有分享。问题是我没有正确设置模型。我还必须在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");
}
感谢所有的答复!
答
好
区模式
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" />
}
确实谢谢你,这工作! – moka