Asp.net mvc 如何发送多值以创建操作
我有一个医生,我想将医生子专业添加到医生子专业表多对多关系中 我需要从multiselect列表中添加子专业,但我的控制器只添加第一个选择,我希望我的创建控制器获取所有传递的子专业并创建它 我的模型Asp.net mvc 如何发送多值以创建操作,asp.net-mvc,model-view-controller,entity-framework-6,Asp.net Mvc,Model View Controller,Entity Framework 6,我有一个医生,我想将医生子专业添加到医生子专业表多对多关系中 我需要从multiselect列表中添加子专业,但我的控制器只添加第一个选择,我希望我的创建控制器获取所有传递的子专业并创建它 我的模型 public partial class DoctorSubSpecialty { public int Id { get; set; } public Nullable<int> DoctorId { get; set; } public Nullable<
public partial class DoctorSubSpecialty
{
public int Id { get; set; }
public Nullable<int> DoctorId { get; set; }
public Nullable<int> SubSpecialtyId { get; set; }
public virtual DoctorProfile DoctorProfile { get; set; }
public virtual SubSpecialty SubSpecialty { get; set; }
}
创建后期操作
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Id,DoctorId,SubSpecialtyId")] DoctorSubSpecialty doctorSubSpecialty)
{
DoctorSubSpecialty doctorSub = db.DoctorSubSpecialties.Where(d => d.DoctorId == doctorSubSpecialty.DoctorId & d.SubSpecialtyId == doctorSubSpecialty.SubSpecialtyId).FirstOrDefault();
if (doctorSub == null) {
db.DoctorSubSpecialties.Add(doctorSubSpecialty);
await db.SaveChangesAsync();
}
{
@Html.AntiForgeryToken()
博士专科
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@LabelFor(model=>model.DoctorId,“DoctorId”,htmlAttributes:new{@class=“control label col-md-2”,@id=“DoctorId”})
@DropDownList(“DoctorId”,null,htmlAttributes:new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.DoctorId,“,new{@class=“text danger”})
@LabelFor(model=>model.SubSpecialtyId,“SubSpecialtyId”,htmlAttributes:new{@class=“controllabel col-md-2”})
@DropDownList(“SubSpecialtyId”,(MultiSelectList)ViewBag.SubSpecialtyId,htmlAttributes:new{@multiple=“multiple”,@class=“form control”})
@Html.ValidationMessageFor(model=>model.SubSpecialtyId,“,new{@class=“text danger”})
}创建一个特定于您的用例的视图模型,该视图模型实际上可以传输多个Id。 也就是说,您需要一个
int[]
来绑定所选内容。
ViewModel还可以帮助您摆脱所有这些ViewBag
和[Bind]
废话
public class CreateDoctorSubSpecialtyViewModel {
// These are the selected values to be posted back
public int DoctorId { get; set; }
public int[] SubSpecialtyIds { get; set; }
// These are the possible values for the dropdowns
public IEnumerable<SelectListItem> DoctorProfiles { get; set; }
public IEnumerable<SelectListItem> SubSpecialties { get; set; }
}
查看“Create.cshtml”(为了清晰起见,样式设置已删除)-告诉MVC我们要在@model
中使用哪个ViewModel:
@model CreateDoctorSubSpecialtyViewModel
@using (Html.BeginForm("Create", "YourControllerName", FormMethod.Post)) {
@Html.DropDownListFor(m => m.DoctorId, Model.DoctorProfiles)
@Html.DropDownListFor(m => m.SubSpecialtyIds, Model.SubSpecialties, new { multiple = "multiple" })
<input type="submit" />
}
EDIT
@Html。DropDownListFor
需要一个IEnumerable
作为第二个参数
<div class="form-horizontal">
<h4>DoctorSubSpecialty</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.DoctorId, "DoctorId", htmlAttributes: new { @class = "control-label col-md-2", @id = "DoctorID" })
<div class="col-md-10">
@Html.DropDownList("DoctorId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.DoctorId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.SubSpecialtyId, "SubSpecialtyId", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("SubSpecialtyId",(MultiSelectList)ViewBag.SubSpecialtyId, htmlAttributes: new { @multiple = "multiple", @class = "form-control" })
@Html.ValidationMessageFor(model => model.SubSpecialtyId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
public class CreateDoctorSubSpecialtyViewModel {
// These are the selected values to be posted back
public int DoctorId { get; set; }
public int[] SubSpecialtyIds { get; set; }
// These are the possible values for the dropdowns
public IEnumerable<SelectListItem> DoctorProfiles { get; set; }
public IEnumerable<SelectListItem> SubSpecialties { get; set; }
}
[HttpGet]
public ActionResult Create() {
var doctorProfiles = db.DoctorProfiles.Select(d =>
new SelectListItem {
Text = d.FullName,
Value = d.Id
}
).ToArray();
var subSpecialties = db.SubSpecialties.Select(s =>
new SelectListItem {
Text = s.Name,
Value = s.id
}
).ToArray();
var viewModel = new CreateDoctorSubSpecialtyViewModel {
DoctorProfiles = doctorProfiles,
SubSpecialties = subSpecialties
};
return View("Create", viewModel);
}
@model CreateDoctorSubSpecialtyViewModel
@using (Html.BeginForm("Create", "YourControllerName", FormMethod.Post)) {
@Html.DropDownListFor(m => m.DoctorId, Model.DoctorProfiles)
@Html.DropDownListFor(m => m.SubSpecialtyIds, Model.SubSpecialties, new { multiple = "multiple" })
<input type="submit" />
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(CreateDoctorSubSpecialtyViewModel postData) {
DoctorSubSpecialty[] allSelectedSubSpecialities = db.DoctorSubSpecialties
.Where(d => d.DoctorId == postData.DoctorId
&& postData.SubSpecialtyIds.Contains(d.SubSpecialtyId))
.ToArray();
// ...
}