1

Это мой первый проект MVC с нуля, и я пытаюсь отобразить несколько повторяющихся данных записи в представлении, когда он сначала загружается, а затем позволяет пользователю редактировать поля на одной странице, когда нажмите кнопку «Изменить» и сохраните данные для этой конкретной записи. У меня есть некоторые данные, но я чувствую, что делаю это неправильно.Отображение всех данных в представлении MVC

Это мой GeneRuleViewModel.cs

public class GeneRuleViewModel 
    { 

    public virtual IEnumerable<GeneRule> GeneRules { get; set; } 
    public virtual IEnumerable<GeneGroup> GeneGroups { get; set; } 
    public List<KeyValuePair<int, string>> RuleDataStarDesignation { get; set; } 
    public List<KeyValuePair<int, IEnumerable<SelectListItem>>> RuleDataPhenotype { get; set; } 
    public List<KeyValuePair<int, bool>> RuleDataClinicallySignificant { get; set; } 

    [DisplayName("Star Designation:")] 
    public string StarDesignation { get; set; } 
    [DisplayName("Phenotype:")] 
    public string SelectedPhenotype { get; set; } 
    [DisplayName("ClinicallySignificant?")] 
    public bool ClinicallySignificant { get; set; } 
    } 

Я использовал KeyValuePair так, что, когда цикл по элементам в представлении я мог знать, какое значение принадлежит конкретному GeneRule_ID

Это мой индекс (метод) в GeneRuleController.cs где я заселяющий KeyValuePairs из хранилища

 public ActionResult Index() 
    { 
     var geneRules = generuleRepository.GetGeneRules(); 
     var geneGroups = generuleRepository.GetGeneGroups(); 

     List<KeyValuePair<int, string>> ruleStarDesignation = new List<KeyValuePair<int, string>>(); 
     List<KeyValuePair<int, IEnumerable<SelectListItem>>> rulePhenotype = new List<KeyValuePair<int, IEnumerable<SelectListItem>>>(); 
     List<KeyValuePair<int, bool>> ruleClinicallySignificant = new List<KeyValuePair<int, bool>>(); 


     foreach (var rule in geneRules) 
     { 
      rulePhenotype.Add(new KeyValuePair<int, IEnumerable<SelectListItem>>((int)rule.GeneRule_ID, generuleRepository.GetRulePhenotypes(rule))); 
      ruleStarDesignation.Add(new KeyValuePair<int, string>((int)rule.GeneRule_ID, generuleRepository.GetRuleStarDesignation(rule))); 
      ruleClinicallySignificant.Add(new KeyValuePair<int, bool>((int)rule.GeneRule_ID, generuleRepository.GetRuleClinicalSignificance(rule)));  
     } 

     var generuleViewModel = new GeneRuleViewModel(); 
     generuleViewModel.GeneRules = geneRules; 
     generuleViewModel.GeneGroups = geneGroups; 
     generuleViewModel.RuleDataStarDesignation = ruleStarDesignation; 
     generuleViewModel.RuleDataPhenotype = rulePhenotype; 
     generuleViewModel.RuleDataClinicallySignificant = ruleClinicallySignificant; 


     return View(generuleViewModel); 
    } 

Это мой Index.cshtml где я зацикливание через каждый GeneGroups и GeneRules для отображения данных

<div id="generulesgrid"> 
    <span class="glyphicon glyphicon-filter"></span>&nbsp;<span class="h4">Rule Filter</span> 
    <div class="btn-group rulefilter"> 
     <button type="button" class="filter btn btn-default" data-filter="all">Show All</button>   
     @foreach (var geneGroup in Model.GeneGroups) {  
      <button type="button" class="filter btn btn-default" data-filter="@Html.DisplayFor(x => geneGroup.GeneGroup_NM)">@Html.DisplayFor(x => geneGroup.GeneGroup_NM)</button> 
     } 
    </div> 


@foreach (var geneGroup in Model.GeneGroups) {  
    <div class="mix @Html.DisplayFor(x => geneGroup.GeneGroup_NM)"> 
     <div class="row"> 
      <div class="col-md-12"> 
       <div class="page-header"> 
        <span class="glyphicon glyphicon-list"></span>&nbsp;<span class="h4">Gene Rules for <small>@Html.DisplayFor(x => geneGroup.GeneGroup_NM)</small></span>     
       </div> 
      </div> 
     </div> 

     <div class="row"> 
      @foreach(var geneRule in Model.GeneRules.Where(x => x.GeneGroup_ID == geneGroup.GeneGroup_ID)) 
      { 
       <div class="col-md-4"> 
        @using (Html.BeginForm(null, "generule", FormMethod.Post, new { @class = "form-horizontal", @role = "form" })) 
        { 
         <div class="panel panel-default"> 
          <div class="panel-heading"> 
           @Html.DisplayFor(x=> geneRule.GeneRule_NM) <span class="glyphicon glyphicon-edit pull-right editRule" data-toggle="tooltip" title="Edit Rule"></span> 
          </div> 
          <div class="panel-body"> 
           <div class="form-group"> 
            @Html.LabelFor(x => x.StarDesignation, new { @class = "col-md-4 control-label" }) 
            <div class="col-md-8"> 
             @Html.TextBoxFor(x => x.StarDesignation, new {@Value = Model.RuleDataStarDesignation.Where(x => x.Key == geneRule.GeneRule_ID).FirstOrDefault().Value, @class = "form-control", @placeholder = "Enter Star Designation"}) 
            </div> 
           </div> 

           <div class="form-group"> 
            @Html.LabelFor(x => x.SelectedPhenotype, new { @class = "col-md-4 control-label" }) 
            <div class="col-md-8"> 
             @Html.DropDownListFor(x=>x.SelectedPhenotype,Model.RuleDataPhenotype.Where(x => x.Key == geneRule.GeneRule_ID).FirstOrDefault().Value,"select phenotype",new {@id = "generule_" + geneRule.GeneRule_ID + "_phenotype", @class = "form-control" }) 
            </div> 
           </div> 
           <div class="form-group">          
            @Html.Label("Rule Definition","Rule Definition:",new { @class = "col-md-4 control-label" }) 
            <div class="col-md-8"> 
            </div> 
           </div> 

           <div class="form-group"> 
            <div class="checkbox"> 
             <label>           
              @Html.CheckBoxFor(x=> x.ClinicallySignificant, Model.RuleDataClinicallySignificant.Where(y => y.Key == geneRule.GeneRule_ID).FirstOrDefault().Value) 

             </label> 
            </div> 
           </div> 

          </div> 
         </div> 
        } 
       </div>  
      } 
     </div> 
    </div> 


} 
</div> 

Как я уже сказал, я чувствую, как будто что я буду об этом неправильный путь, так что любая помощь/советы будут оценены.

+0

Есть всегда несколько способов приблизиться к проблеме, что же беспокоит вас с таким подходом? – RealityDysfunction

+0

Я не уверен, должен ли я использовать петли foreach для прохождения записей или шаблонов отображения/редактора? Смогу ли я получить значения для конкретной записи, которая была обновлена ​​и сохранена? Правильно ли я получаю данные для просмотра? – iambdot

ответ

1

Это выглядит прилично для меня, мой подход был бы немного другим; Я бы создал частичное представление для каждого под-списка в модели таким образом, что каждый частичный вид принимает простой строго типизированный список.

Однако, ваш способ также может работать. Имейте в виду (много новичков MVC совершают эту ошибку), ваш ViewModel не должен соответствовать модели, к которой вы привязываетесь, когда вы отправляете изменения.

Если вы хотите быть более гладким, вы можете использовать AJAX и позже избежать сложной привязки (но вам нужно будет настроить AJAX, который занимает некоторое время).

Редактировать: Если вы хотите самый простой подход, поместите кнопку редактирования с соответствующим идентификатором рядом с каждым элементом, который вы хотите отредактировать, поэтому вам очень легко найти элемент, который вы редактируете.

Edit 2: Некоторые хороший пример здесь: How to bind multiple textbox with ViewModel array string property?

+0

Как я могу привязываться к другой модели при отправке изменений? – iambdot

+0

Вы просто создаете новую модель, а при получении модели (в параметрах действия/метода) вы помещаете свою новую модель. Однако для правильной работы привязки «имена» ваших элементов на странице должны совпадать с полем в вашей новой модели. Пример. Если у вас есть элемент name_worker, то ваша новая модель должна иметь String name_worker. Очень сложный пример этого метода можно увидеть здесь, он может дать некоторое представление: http://groovycoder.wordpress.com/2013/11/17/binding-multiple-sets-of-checkboxes-in-asp-net- MVC / – RealityDysfunction

Смежные вопросы