2010-01-23 2 views
0

контроллерПолучить отправил выбранный элемент из DropDownList в ASP MVC

public ActionResult Create() 
{ 
    return View(new PageViewModel()); 
} 

[HttpPost] 
public ActionResult Create(Page page) 
{ 
    try 
    { 
     repPage.Add(page); 
     repPage.Save(); 

     return RedirectToAction("Edit"); 
    } 
    catch 
    { 
     return View(new PageViewModel()); 
    } 
} 

PageViewModel

public class PageViewModel 
{ 
    public Page Page { get; set; } 
    public List<Template> Templates { get; set; } 

    private TemplateRepository repTemplates = new TemplateRepository(); 

    public PageViewModel() 
    { 
     Page = new Page(); 
     Templates = repTemplates.GetAllTemplates().ToList(); 
    } 
} 

Части мой взгляд

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Website.Models.PageViewModel>" %> 

<%= Html.TextBoxFor(model => model.Page.Name, new { @style = "width:300px;" })%> 

<%= Html.DropDownListFor(model => model.Page.Template, new SelectList(Model.Templates, "ID", "Name"), new { @style = "width:306px;" })%> 

Шаблон: ID Имя
Страница: ID Имя TemplateID

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

В моем контроллере я устанавливаю точку останова в Edit и вижу, что текстовое поле Name заполнено значением, которое я вводил в него. Но выбранный из выпадающего списка имеет значение null.

alt text http://www.mgmweb.no/images/debug.jpg

Могу ли я что-то отсутствует, я подумал, что это должно установить правильное Template значение в Page объекта. Что я делаю не так?

ответ

1

Единственное, что вы получите обратно на веб-странице идентификатор выбранного шаблона. Связующее устройство по умолчанию не знает, как взять этот идентификатор и получить правильный объект шаблона из вашего репозитория. Для этого вам нужно будет реализовать настраиваемое связующее устройство, которое может извлекать значения из базы данных, создавать объект Template и назначать его на страницу. Или ... вы можете сделать это вручную в действии, учитывая, что, согласно вашим комментариям в другом месте, вы знаете, как получить идентификатор шаблона из опубликованных значений.

2

Попробуй что-нибудь вроде этого, может быть? Ключ в коллекции является имя элемента управления DropDownList ...

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection collection) 
     { 
      try 
      { 
       string selectedvalue = collection["Template"]; 

       return RedirectToAction("Edit"); 
      } 
      catch 
      { 
       return View(new PageViewModel()); 
      } 
     } 
+0

' int templateID = int.Parse (коллекция ["Страница.Template"]); этот код правильно возвращает идентификатор шаблона, как вы писали. Но возможно ли получить значение из строго типизированного объекта, а не 'FormCollection' и написать« Page.Template »? – Martin

0

Хорошо, я сделал так:

 [HttpPost] 
     public ActionResult Create(FormCollection collection) 
     { 
      try 
      { 
       Page page = new Page(); 
       page.Name = collection["Page.Name"]; 
       page.TemplateID = int.Parse(collection["Page.Template"]); 
       page.Created = DateTime.Now; 

       repPage.Add(page); 
       repPage.Save(); 

       return RedirectToAction("Edit"); 
      } 
      catch 
      { 
       return View(new PageViewModel()); 
      } 
     } 

И это работает хорошо, я просто хотел бы знать, если есть лучший способ, чтобы это не вручную получать значения из коллекции.

Но, я думаю, это невозможно без создания собственного связующего для модели, как сказал tvanfosson.

Спасибо всем.

+0

Конечно, было бы здорово, если бы это произошло со стандартным связующим устройством MVC. Если кто-то найдет более чистое решение, звоните! –

0

для модели связывания, использование в ActionResult:

partial ActionResult(FormCollection form) 
{ 
    Page page = new Page(); 
    UpdateModel(page); 
    return view(page); 
} 

вашего класс:

public class Page 
{ 
    public string Name {get; set;} 
    public int Template {get; set;} 
    public DateTime Created {get; set;} 

    public Page() 
    { 
    this.Created = DateTime.Now; 
    } 

} 

имена атрибутов в классе должны быть равны именем поля зрения

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