2015-09-16 2 views
0

У меня есть небольшая проблема с привязкой формы ajax. Вот код:Ajax.BeginForm Binding

мое редактировать действие:

[HttpPost] 
public ActionResult EditProductionArticle(Article article) 
{ 
    if (ModelState.IsValid) 
    { 
     _ArticleRepository.Edit(article); 
     return RedirectToAction("SelectArticle", new { id = article.DrawingNumber }); 
    } 
    return PartialView(viewModel); 

}

и вот мое мнение:

@using (Ajax.BeginForm("EditProductionArticle", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "selectPartialArticle" })) 
{ 
    <form class="nonActive disabled" id="form"> 
     @Html.ValidationSummary(true) 
     @Html.HiddenFor(model => model.productionArticle.DrawingNumber) 

     @Html.LabelFor(p => p.productionArticle.ArticleDescr, "Article Description") 
     @Html.TextBoxFor(p => p.productionArticle.ArticleDescr, new { @class = "form-control", @placeholder = "Article Description" }) 
     @Html.ValidationMessageFor(p => p.productionArticle.ArticleDescr) 

     @Html.LabelFor(p => p.sellTray, "Trays") 
     @Html.TextBoxFor(p => p.productionArticle.SellTrayCode, new { @class = "form-control", @placeholder = "Trays" }) 
     @Html.ValidationMessageFor(p => p.sellTray) 

     @Html.LabelFor(p => p.productionArticle.BotCode, "Botanical Code") 
     @Html.DropDownList("BotCode", null, new { @class = "form-control", @placeholder = "Botanical Code" }) 
     @Html.ValidationMessageFor(model => model.productionArticle.BotCode, "", new { @class = "text-danger" }) 

     @Html.LabelFor(p => p.productionArticle.CostGrpHL, "Cost Group HL") 
     @Html.DropDownList("CostGrpHL", null, new { @class = "form-control", @placeholder = "Cost Group HL" }) 
     @Html.ValidationMessageFor(model => model.productionArticle.CostGrpHL, "", new { @class = "text-danger" }) 

     <input type="submit" value="EditProductionArticle" /> 
    </form> 
} 

Моя проблема заключается в следующем: если я изменить мой править действие чтобы выглядеть так:

public ActionResult EditProductionArticle([Bind(Prefix = "productionArticle")] Article article) 
{ 
    //bla bla 
} 

свяжет все, кроме выпадающих меню. Если я этого не сделаю, он свяжет выпадающие списки, но ничего больше. Может ли кто-нибудь подумать о том, как это сделать?

Thx.

+0

вы проверили имя выпадающего списка (в HTML) и имя атрибута (класс статьи) такие же? –

ответ

2

Использование @Html.DropDownList("BotCode", null, ...) означает, что вы создаете раскрывающийся список, который является обязательным для свойства с именем BotCode, которого нет в вашей модели. Вы не показали вам модель, но на основе связанных LabelFor() и ValidationMessageFor() содержит свойство с именем productionArticle, который представляет собой сложный объект с свойством с именем BotCode

Если предположить, что назначая SelectLists к ViewBag свойствам в методе GET, дать им другое название от свойства вашего связывания, скажем

ViewBag.BotCodeList = new SelectList(...) // or new List<SelectListItem>... 

, а затем с точки зрения использования строго типизированных хелперы для привязки к вашей модели собственности

@Html.DropDownListFor(p => p.productionArticle.BotCode, (SelectList)ViewBag.BotCodeList, ...) 

или ...(IEnumerable<SelectListItem>)ViewBag.BotCodeList

+0

, но затем я продолжаю получать это: исключение типа «System.InvalidOperationException» произошло в System.Web.Mvc.dll, но не было обработано в коде пользователя Дополнительная информация: Элемент ViewData типа «IEnumerable ', который имеет ключ' productionArticle.BotCode '. – Spluf

+0

Это потому, что вы возвращаете представление в методе POST (я полагаю, потому что 'ModelState' недопустим) и не переназначая значение' ViewBag.BotCodeList', прежде чем вы вернете представление. –

+0

Кроме того, ваш первый фрагмент кода показывает метод POST с параметр 'Article article', но тогда у вас есть' return View (viewModel); 'но я предполагаю, что это просто опечатка? –

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