我的模型无法正确绑定我的视图,因此我需要一些帮助才能朝着正确的方向前进。
我正在处理“事故”,事故具有一些属性,例如年份,碰撞类型等,但是在我的模型中,事故也有一个伤害列表,并且每一个都是从下拉列表中选择的(用户从几乎100种可能的伤害列表中进行选择)。
从某种意义上讲,我们可以说我的模型中有一个“下拉列表”(显然不是下拉列表,但是我这样称呼它,这样您就知道我的问题从哪里开始了,那就是建模“列表列表”)。
这是我的“共享视图”文件夹中的_InjuriesSelect模板:
@model xxx.Models.AccidentViewModel
<div class="col-12 form-group text-dark mx-auto my-auto pb-2">
<div class="container" style="padding-left:0;">
<div class="row">
<div class="col">
@*@Html.DropDownListFor(model => model.Accident.Injuries, Model.Injuries, Model.SelectInjuryText, new { @class = "form-control", @style = "width: 300px;", onchange = @"" })*@
@Html.DropDownList("selectInjuries_1", Model.InjuriesSelect, Model.SelectInjuryText, new { @class = "form-control", @style = "width: 300px;", onchange = @"" })
@Html.ValidationMessageFor(model => model.Accident.Injuries, "", new { @class = "text-danger font-weight-bold" })
</div>
<div class="col">
<a id="removeInjury_1" href="javascript: void(0);" style="text-decoration: none; visibility: hidden;" onclick="javascript: removeInjury(this);">
<i class="fa fa-minus text-danger pr-3" aria-hidden="true"></i>
</a>
<a id="addInjury_1" href="javascript: void(0);" style="text-decoration: none; visibility: hidden;" onclick="javascript: addInjury(this);">
<i class="fa fa-plus text-success" aria-hidden="true"></i>
</a>
</div>
</div>
</div>
</div>
我允许用户通过以下方式添加(或删除)下拉菜单,以使用javascript添加/删除伤害:
function addInjury() {
$.post("/Home/LoadInjurySelect", $("form").serialize(), function (data) {
lastInjuryIndex++;
//add holder for new injury
var newInjurydivId = "divInjuries_" + lastInjuryIndex;
var newInjuryDivHtml = "<div id='" + newInjurydivId + "'>";
newInjuryDivHtml += data.replace(/_1/g, "_" + lastInjuryIndex);
newInjuryDivHtml += "</div>";
$("#divInjuries").append(newInjuryDivHtml);
//hide "add injury" from previous injury
$("#addInjury_" + (lastInjuryIndex - 1).toString()).css("visibility", "hidden");
$("#selectInjuries_" + lastInjuryIndex).change(function () {
var selectedInjury = $('#selectInjuries_' + lastInjuryIndex + ' option:selected').val();
$("#addInjury_" + lastInjuryIndex).css("visibility", selectedInjury != "" ? "visible" : "hidden")
//
setInjuryInModel(selectedInjury);
});
setRemoveInjury1Visibility();
setRemoveInjuryNVisibility(lastInjuryIndex);
});
}
此javascript调用控制器并以这种方式返回部分视图:
[HttpPost]
public ActionResult LoadInjurySelect(AccidentViewModel model)
{
model = fillViewModelLists(model);
return PartialView("~/Views/Shared/_InjuriesSelect.cshtml", model);
}
此方法返回部分视图,但首先填充用于填充下拉列表的所有视图模型IEnumerable Lists(如果不是,则它们会以jQuery形式丢失。序列化时,serialize不包括列表)。
我的事故模型如下:
using xxx.App_GlobalResources;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace xxx.Models
{
public class Accident
{
//Person information
[Display(Name = "home_accident_personname", ResourceType = typeof(languages))]
//[Required(ErrorMessageResourceType = typeof(App_GlobalResources.languages), ErrorMessageResourceName = "home_accident_mustenterpersonname")]
public string PersonName { get; set; }
[Display(Name = "home_accident_personage", ResourceType = typeof(languages))]
[Required(ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_agenotvalid")]
public short PersonAge { get; set; }
[Display(Name = "home_accident_personcondition", ResourceType = typeof(languages))]
[Required(ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_conditionnotvalid")]
public byte PersonCondition { get; set; }
[Display(Name = "home_accident_personemail", ResourceType = typeof(languages))]
//[Required(ErrorMessageResourceType = typeof(App_GlobalResources.languages), ErrorMessageResourceName = "home_accident_mustenterpersonemail")]
[DataType(DataType.EmailAddress)]
[EmailAddress]
public string PersonEmail { get; set; }
//Accident information
[Display(Name = "home_accident_year", ResourceType = typeof(languages))]
[Required(ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_yearnotvalid")]
[Range(2016, 2019)]
public short Year { get; set; }
[Display(Name = "home_accident_collisiontype", ResourceType = typeof(languages))]
[Required(ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_collisiontypenotvalid")]
public byte CollisionType { get; set; }
[Display(Name = "home_accident_hospitalleave", ResourceType = typeof(languages))]
[Range(0, int.MaxValue, ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_medicalleavenotvalid")]
public short HospitalLeaveDays { get; set; }
[Display(Name = "home_accident_workleave", ResourceType = typeof(languages))]
[Range(0, int.MaxValue, ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_medicalleavenotvalid")]
public short WorkLeaveDays { get; set; }
[Display(Name = "home_accident_rehabilitationdays", ResourceType = typeof(languages))]
[Range(0, int.MaxValue, ErrorMessageResourceType = typeof(languages), ErrorMessageResourceName = "home_accident_medicalleavenotvalid")]
public short RehabilitationDays { get; set; }
[Display(Name = "home_accident_injuries", ResourceType = typeof(languages))]
public List<Injury> Injuries { get; set; }
//Compensation
public Compensation Compensation { get; set; }
}
}
我的AccidentViewModel看起来像这样(由于可能的大量伤害而相当长):
using xxx.App_GlobalResources;
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Linq;
namespace xxx.Models
{
public class AccidentViewModel
{
public Accident Accident { get; set; }
public string SelectInjuryText { get { return languages.home_accident_selectinjury; } }
/* VIEWMODEL LISTS / METHODS*/
public IEnumerable<SelectListItem> Years { get; set; }
public static IEnumerable<SelectListItem> fillYearsList()
{
List<SelectListItem> listItems = new List<SelectListItem>();
int y = DateTime.Now.Year;
for (int i = y; i >= y - 3; i--)
{
listItems.Add(new SelectListItem
{
Text = i.ToString(),
Value = i.ToString()
});
}
return listItems;
}
public IEnumerable<SelectListItem> Ages { get; set; }
public static IEnumerable<SelectListItem> fillAgesList()
{
List<SelectListItem> listItems = new List<SelectListItem>();
listItems.Add(new SelectListItem { Text = "", Value = "" });
listItems.Add(new SelectListItem { Text = "0-16", Value = "900" });
listItems.Add(new SelectListItem { Text = "16-25", Value = "850" });
listItems.Add(new SelectListItem { Text = "25-35", Value = "800" });
listItems.Add(new SelectListItem { Text = "35-45", Value = "750" });
listItems.Add(new SelectListItem { Text = "45-65", Value = "700" });
listItems.Add(new SelectListItem { Text = "65+", Value = "650" });
return listItems;
}
public IEnumerable<SelectListItem> Conditions { get; set; }
public static IEnumerable<SelectListItem> fillConditionsList()
{
List<SelectListItem> listItems = new List<SelectListItem>();
listItems.Add(new SelectListItem { Text = "", Value = "" });
listItems.Add(new SelectListItem { Text = languages.home_accident_condition_driver, Value = "1" });
listItems.Add(new SelectListItem { Text = languages.home_accident_condition_companion, Value = Helpers.Utils.getFromWebConfig("successPercentageCompanion") });
listItems.Add(new SelectListItem { Text = languages.home_accident_condition_pedestrian, Value = Helpers.Utils.getFromWebConfig("successPercentagePedestrian") });
return listItems;
}
public IEnumerable<SelectListItem> Collisions { get; set; }
public static IEnumerable<SelectListItem> fillCollisionsList()
{
List<SelectListItem> listItems = new List<SelectListItem>();
listItems.Add(new SelectListItem { Text = "", Value = "" });
listItems.Add(new SelectListItem { Text = languages.home_accident_collisionfront, Value = Helpers.Utils.getFromWebConfig("successPercentageCollisionFront") });
listItems.Add(new SelectListItem { Text = languages.home_accident_collisionside, Value = Helpers.Utils.getFromWebConfig("successPercentageCollisionSide") });
listItems.Add(new SelectListItem { Text = languages.home_accident_collisionrear, Value = Helpers.Utils.getFromWebConfig("successPercentageCollisionBack") });
return listItems;
}
//
public List<InjuryGroup> InjuriesGroups { get; set; }
public static List<InjuryGroup> fillInjuriesGroupsList()
{
List<InjuryGroup> injuriesGroupsList = new List<InjuryGroup>();
injuriesGroupsList.Add(new InjuryGroup { Id = 1, Name = InjuryGroups.Lesiones_AfectacionesNerviosas });
injuriesGroupsList.Add(new InjuryGroup { Id = 2, Name = InjuryGroups.Lesiones_TranstornosPsicologicos });
injuriesGroupsList.Add(new InjuryGroup { Id = 3, Name = InjuryGroups.Lesiones_LesionesOculares });
injuriesGroupsList.Add(new InjuryGroup { Id = 4, Name = InjuryGroups.Lesiones_LesionesAuditivas });
injuriesGroupsList.Add(new InjuryGroup { Id = 5, Name = InjuryGroups.Lesiones_LesionesNasales });
injuriesGroupsList.Add(new InjuryGroup { Id = 6, Name = InjuryGroups.Lesiones_LesionesMandibulares });
injuriesGroupsList.Add(new InjuryGroup { Id = 7, Name = InjuryGroups.Lesiones_LesionesCervicales });
injuriesGroupsList.Add(new InjuryGroup { Id = 8, Name = InjuryGroups.Lesiones_LesionesExtremidadesSuperiores });
injuriesGroupsList.Add(new InjuryGroup { Id = 9, Name = InjuryGroups.Lesiones_LesionesExtremidadesInferiores });
injuriesGroupsList.Add(new InjuryGroup { Id = 10, Name = InjuryGroups.Lesiones_LesionesRodilla });
injuriesGroupsList.Add(new InjuryGroup { Id = 11, Name = InjuryGroups.Lesiones_LesionesTobillo });
injuriesGroupsList.Add(new InjuryGroup { Id = 12, Name = InjuryGroups.Lesiones_LesionesPie });
injuriesGroupsList.Add(new InjuryGroup { Id = 13, Name = InjuryGroups.Lesiones_LesionesCadera });
injuriesGroupsList.Add(new InjuryGroup { Id = 14, Name = InjuryGroups.Lesiones_LesionesCardiacas });
injuriesGroupsList.Add(new InjuryGroup { Id = 15, Name = InjuryGroups.Lesiones_LesionesOrganoDigestivo });
injuriesGroupsList.Add(new InjuryGroup { Id = 16, Name = InjuryGroups.Lesiones_LesionesSistemaUrinario });
injuriesGroupsList.Add(new InjuryGroup { Id = 17, Name = InjuryGroups.Lesiones_Quemaduras });
injuriesGroupsList.Add(new InjuryGroup { Id = 18, Name = InjuryGroups.Lesiones_LesionesNeurologicasMedulares });
injuriesGroupsList.Add(new InjuryGroup { Id = 19, Name = InjuryGroups.Lesiones_LesionesRespitarorias });
return injuriesGroupsList;
}
public List<SelectListGroup> InjuriesSelectGroups { get; set; }
public static List<SelectListGroup> fillInjuriesSelectListGroup(AccidentViewModel model) {
List<SelectListGroup> injuriesSelectListGroup = new List<SelectListGroup>();
foreach (InjuryGroup injuryGroup in model.InjuriesGroups) {
injuriesSelectListGroup.Add(new SelectListGroup { Name = injuryGroup.Name });
}
return injuriesSelectListGroup;
}
//
public List<Injury> Injuries { get; set; }
public static List<Injury> fillInjuriesList(AccidentViewModel model)
{
InjuryGroup Lesiones_AfectacionesNerviosas = model.InjuriesGroups[0];
InjuryGroup Lesiones_TranstornosPsicologicos = model.InjuriesGroups[1];
InjuryGroup Lesiones_LesionesOculares = model.InjuriesGroups[2];
InjuryGroup Lesiones_LesionesAuditivas = model.InjuriesGroups[3];
InjuryGroup Lesiones_LesionesNasales = model.InjuriesGroups[4];
InjuryGroup Lesiones_LesionesMandibulares = model.InjuriesGroups[5];
InjuryGroup Lesiones_LesionesCervicales = model.InjuriesGroups[6];
InjuryGroup Lesiones_LesionesExtremidadesSuperiores = model.InjuriesGroups[7];
InjuryGroup Lesiones_LesionesExtremidadesInferiores = model.InjuriesGroups[8];
InjuryGroup Lesiones_LesionesRodilla = model.InjuriesGroups[9];
InjuryGroup Lesiones_LesionesTobillo = model.InjuriesGroups[10];
InjuryGroup Lesiones_LesionesPie = model.InjuriesGroups[11];
InjuryGroup Lesiones_LesionesCadera = model.InjuriesGroups[12];
InjuryGroup Lesiones_LesionesCardiacas = model.InjuriesGroups[13];
InjuryGroup Lesiones_LesionesRespitarorias = model.InjuriesGroups[14];
InjuryGroup Lesiones_LesionesOrganoDigestivo = model.InjuriesGroups[15];
InjuryGroup Lesiones_LesionesSistemaUrinario = model.InjuriesGroups[16];
InjuryGroup Lesiones_Quemaduras = model.InjuriesGroups[17];
InjuryGroup Lesiones_LesionesNeurologicasMedulares = model.InjuriesGroups[18];
List<Injury> injuries = new List<Injury>();
injuries.Add(new Injury { Id = 1, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNerviosaAuditiva, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNerviosaAuditiva")), Group = Lesiones_AfectacionesNerviosas });
injuries.Add(new Injury { Id = 2, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNerviosaOcular, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNerviosaOcular")), Group = Lesiones_AfectacionesNerviosas });
injuries.Add(new Injury { Id = 3, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNervioCiatico, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNervioCiatico")), Group = Lesiones_AfectacionesNerviosas });
injuries.Add(new Injury { Id = 4, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNerviosaMandibular, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNerviosaMandibular")), Group = Lesiones_AfectacionesNerviosas });
injuries.Add(new Injury { Id = 5, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNerviosaRadioCubito, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNerviosaRadioCubito")), Group = Lesiones_AfectacionesNerviosas });
injuries.Add(new Injury { Id = 6, Text = languages.Lesiones_AfectacionesNerviosas_AfectacionNerviosaTibia, Value = int.Parse(Helpers.Utils.getFromWebConfig("Lesiones_AfectacionesNerviosas_AfectacionNerviosaTibia")), Group = Lesiones_AfectacionesNerviosas });
...
return injuries;
}
public IEnumerable<SelectListItem> InjuriesSelect { get; set; }
public static IEnumerable<SelectListItem> fillInjuriesSelectList(AccidentViewModel model)
{
List<SelectListItem> injuriesSelectList = new List<SelectListItem>();
foreach (InjuryGroup injuryGroup in model.InjuriesGroups) {
foreach (Injury injury in model.Injuries.Where(x => x.Group == injuryGroup).ToList()) {
injuriesSelectList.Add(new SelectListItem { Text = injury.Text, Value = injury.Id.ToString(), Group = model.InjuriesSelectGroups.Where(x => x.Name == injuryGroup.Name).First() });
}
}
return injuriesSelectList;
}
}
伤害模型:
using xxx.App_GlobalResources;
namespace xxx.Models
{
public class Injury
{
public int Id { get; set; }
public string Text { get; set; }
public int Value { get; set; }
public InjuryGroup Group { get; set; }
}
public static class InjuryGroups
{
public static string Lesiones_AfectacionesNerviosas { get { return languages.Lesiones_AfectacionesNerviosas; } }
public static string Lesiones_TranstornosPsicologicos { get { return languages.Lesiones_TranstornosPsicologicos; } }
public static string Lesiones_LesionesOculares { get { return languages.Lesiones_LesionesOculares; } }
public static string Lesiones_LesionesAuditivas { get { return languages.Lesiones_LesionesAuditivas; } }
public static string Lesiones_LesionesNasales { get { return languages.Lesiones_LesionesNasales; } }
public static string Lesiones_LesionesMandibulares { get { return languages.Lesiones_LesionesMandibulares; } }
public static string Lesiones_LesionesCervicales { get { return languages.Lesiones_LesionesCervicales; } }
public static string Lesiones_LesionesExtremidadesSuperiores { get { return languages.Lesiones_LesionesExtremidadesSuperiores; } }
public static string Lesiones_LesionesExtremidadesInferiores { get { return languages.Lesiones_LesionesExtremidadesInferiores; } }
public static string Lesiones_LesionesRodilla { get { return languages.Lesiones_LesionesRodilla; } }
public static string Lesiones_LesionesTobillo { get { return languages.Lesiones_LesionesTobillo; } }
public static string Lesiones_LesionesPie { get { return languages.Lesiones_LesionesPie; } }
public static string Lesiones_LesionesCadera { get { return languages.Lesiones_LesionesCadera; } }
public static string Lesiones_LesionesCardiacas { get { return languages.Lesiones_LesionesCardiacas; } }
public static string Lesiones_LesionesRespitarorias { get { return languages.Lesiones_LesionesRespitarorias; } }
public static string Lesiones_LesionesOrganoDigestivo { get { return languages.Lesiones_LesionesOrganoDigestivo; } }
public static string Lesiones_LesionesSistemaUrinario { get { return languages.Lesiones_LesionesSistemaUrinario; } }
public static string Lesiones_Quemaduras { get { return languages.Lesiones_Quemaduras; } }
public static string Lesiones_LesionesNeurologicasMedulares { get { return languages.Lesiones_LesionesNeurologicasMedulares; } }
}
}
伤害组模型:
使用System.Collections.Generic;
命名空间补偿Calc.Models { 公共伤害小组 { public int ID {get;组; } 公共字符串名称{get;组; } 公开清单伤害{get;组; } } }
最后,我无法将伤害下拉列表与模型绑定在一起,因此在提交表单时,伤害列表包含所有选定伤害,换句话说,就是用户选择的伤害(添加)新伤害,模型将使用相应的值更新伤害列表。
我也不理解(这是概念上的),如果我通过PartialView通过模板添加伤害下拉列表,并且通过javascript post call进行此操作,那么将新添加的下拉列表ID插入html会发生什么?我是否必须使用javascript重命名它们,以便每次添加新伤害时都不会在DOM中重复新的下拉ID?
最重要的是在将我的“下拉列表”与事故模型绑定的最佳方法上有所帮助(当然,还要使每个新添加的下拉列表也与该模型绑定)。
我知道我应该使用DropDownListFor而不是DropDownList,但是我不确定该怎么做。
谢谢。
答案 0 :(得分:0)
好吧,我将结束自己的问题,以防其他人遇到类似的问题。
如果模型中有一个列表,则下一种处理列表的方法是
在模型中,我添加了一个新属性来保存下拉菜单中的SelectedInjury(以我为例)。
public int SelectedInjury { get; set; }
在视图中,我通过以下方式创建了DropDownList:
@Html.DropDownListFor(model => model.Accident.Injuries[0].SelectedInjury, Model.Injuries, Model.SelectInjuryText, new { @class = "form-control", @style = "width: 300px;", onchange = @"" })
然后,在javascript中,我有一个Injury计数器,每当添加新的DropDowns(来自控制器通过ajax调用从模板中获取)时,我只需替换Accident_Injuries [0]中的“ 0”即可(这或多或少生成的html id)以及相应的新索引,然后再将html添加到DOM。这样,当您在下拉列表中选择一个新项目时,新的“伤害”对象会自动添加到列表中,因此无需对控制器或其他任何对象进行ajax调用即可更新模型(这是我的邮件问题)。
干杯,祝您编程愉快!