Asp.net mvc 如何发送多值以创建操作

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<

我有一个医生,我想将医生子专业添加到医生子专业表多对多关系中

我需要从multiselect列表中添加子专业,但我的控制器只添加第一个选择,我希望我的创建控制器获取所有传递的子专业并创建它

我的模型

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();

    // ...
}