2016-11-20 3 views
0

Новое в MVC и просто пытается получить данные моей формы из списка <>. В моем контроллере я могу правильно определить значение имени (имя рецепта), но не могу получить значение имени ингредиента, всегда возвращающееся как NULL?Формы бритвы со списками

Ниже приведены некоторые фрагменты кода из моего проекта.

МОДЕЛЬ

public class Recipe 
{ 

    [Required] 
    public string Name { get; set; } 
    public List<Ingredient> Ingredients { get; set; } 

    public Recipe() 
    { 
     Ingredients = new List<Ingredient>() 
     { 
      new Ingredient() 
     }; 

    } 
} 

public class Ingredient 
{ 
    public string Name { get; set; } 
} 

VIEW

@using (Html.BeginForm("CreateEdit", "Recipe")) 
    { 
     @Html.ValidationSummary() 
     <div class="form-group"> 
      @Html.LabelFor(x => x.Name, "Name") 
      @Html.TextBoxFor(x => x.Name, new { @class = "form-control" }) 
      @Html.ValidationMessageFor(x => x.Name) 
     </div> 

     <h2>Ingredient(s)</h2> 
     <div class="form-group"> 
      @Html.LabelFor(x => x.Ingredients.FirstOrDefault().Name, "Name") 
      @Html.TextBoxFor(x => x.Ingredients.FirstOrDefault().Name, new { @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <input class="btn btn-primary" type="submit" text="submit" /> 
     </div> 
    } 

CONTROLLER

[HttpPost] 
public ActionResult CreateEdit(Recipe recipe) 
{   
    var recipeName = recipe.Name // <--- Works 
    var ingredientName = recipe.Ingredients.FirstOrDefault().Name; //<--- NULL value 

    return View(recipe); 
} 
+1

Посмотрите на это: http://stackoverflow.com/a/23553225/3585278 – Danieboy

+1

Вы не можете использовать '.FirstOrDefault()' в представлении - вам нужно использовать цикл 'for' или пользовательский' EditorTemplate' для «Ингредиент» - см. [этот ответ] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943). Но если вам нужен только один «Ингредиент», почему вы используете «Список '? –

+1

@ Danieboy спасибо, что решила мою проблему – Sanchez89

ответ

0
  1. Ingredients является свойством класса Recipe и типа List<Ingredient>.
  2. Действие, которое вы публикуете в CreateEdit, имеет параметр Recipe.

Чтобы связать объекты списка, нам необходимо предоставить индекс для каждого элемента. Как, например

<form method="post" action="/Home/CreateEdit"> 

    <input type="text" name="recipe.Ingredients[0].Name" value="Red Sauce" /> 

    <input type="text" name="recipe.Ingredients[1].Name" value="White Sauce" />  

</form> 

Читать эту ссылку - http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/, чтобы понять это лучше.

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