允许实体在更新视图中存在两次

时间:2012-07-06 14:57:19

标签: c# asp.net-mvc-3 razor entity

编辑模型时,下拉列表中存在实体“ProgramType”。如果用户在现有集合中看不到他们需要什么,他们需要能够在同一编辑屏幕上向该集合添加新条目。

基本上,似乎我需要在同一编辑视图中存在两次相同的实体。如果为下拉菜单选择了特定值,则文本字段会执行jQuery“show”以允许它们添加新数据。

 <div class="editor-label">
            @Html.LabelFor(model => model.ProgramTypeId, "Program Type")
        </div>
        <div class="editor-field">
            @Html.DropDownList("ProgramTypeId", "- Select a Program Type - ")
            @Html.ValidationMessageFor(model => model.ProgramTypeId)
        </div>

//this div is hidden via jQuery unless needed

        <div class="editor-label hiddenDiv">
            @Html.Label("New Program Type Title:")
        </div>
        <div class="editor-field hiddenDiv">
            @Html.EditorFor(model => model.ProgramType.ProgramType)
            @Html.ValidationMessageFor(model => model.ProgramType.ProgramType)
        </div>
//
        <div class="editor-label">
            @Html.LabelFor(model => model.ProgramYear)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProgramYear)
            @Html.ValidationMessageFor(model => model.ProgramYear)
        </div>

实现这一目标的最佳方法是什么?我真的很想使用表单集合,但这似乎可能是“糟糕的做法”。

public class SurveyProgramModel
    {

        [Key]
        public int ProgramId { get; set; }

        [DisplayName("Year")]
        public int ProgramYear { get; set; }

        [DisplayName("Status")]
        public int ProgramStatusId { get; set; }

        [DisplayName("Program Title")]
        public string ProgramTitle { get; set; }

        public int ProgramTypeId { get; set; }

        [DisplayName("Program Type")]
        public virtual SurveyProgramTypeModel ProgramType { get; set; }

        [DisplayName("Status")]
        public virtual ProgramStatusModel ProgramStatusModel { get; set; }

        public virtual ICollection<SurveyResponseModel> SurveyResponseModels { get; set; }


    }




public class SurveyProgramTypeModel
    {

        [Key]
        public int ProgramTypeId { get; set; }

        [DisplayName("Program Type")]
        public string ProgramType { get; set; }


    }

1 个答案:

答案 0 :(得分:1)

一种方法是修改您的视图模型以包含例如。

public IEnumerable<SelectListItem> ProgramTypes { get; set; }
public int SelectedProgramType { get; set; }
public string NewProgramType { get; set; }

在您的控制器操作中,使用持久层中可能值的列表填充ProgramTypes,再加上额外值“Add new ...”。

在您的视图中,您可以将下拉列表呈现为

@Html.DropDownListFor(m => m.SelectedProgramType, Model.ProgramTypes)

然后添加一些jQuery以根据所选值显示和隐藏<div>。在此<div>添加

@Html.EditorFor(m => m.NewProgramType)

[HttpPost]操作方法中添加逻辑以确定它们是否正在添加新值,然后将新值保存到持久层。