【问题标题】:how i can send multivalue to create action我如何发送多值来创建动作
【发布时间】:2018-11-27 12:29:25
【问题描述】:

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

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

我的模特

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

}

创建获取操作

public ActionResult Create()
    {
            ViewBag.DoctorId = new SelectList(db.DoctorProfiles, "Id", "FullName");
            ViewBag.SubSpecialtyId = new MultiSelectList(db.SubSpecialties, "id", "Name");
            return View();
        }

创建帖子操作

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

我的看法

@using (Html.BeginForm()) 

{ @Html.AntiForgeryToken()

<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>

}

【问题讨论】:

    标签: asp.net-mvc model-view-controller entity-framework-6


    【解决方案1】:

    创建一个特定于您的用例的 ViewModel,它实际上可以传输多个 Id。 IE。您将需要一个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; }
    }
    

    GET 操作 - 初始化 ViewModel 并将其传递给 View:

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

    查看“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" />
    }
    

    POST 操作 - 使用 Linq Contains 测试多个提交的 SubSpecialtyIds

    [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();
    
        // ...
    }
    

    EDIT @Html.DropDownListFor 需要 IEnumerable&lt;SelectListItem&gt; 作为第二个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多