Опубликовать выбранный элемент из DropDownList в ASP MVC - PullRequest
0 голосов
/ 23 января 2010

Контроллер

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;" })%>

Шаблон: Я БЫ Имя
Страница: Я БЫ название TemplateID

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

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

альтернативный текст http://www.mgmweb.no/images/debug.jpg

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

Ответы [ 4 ]

2 голосов
/ 23 января 2010

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

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

              return RedirectToAction("Edit");
           }
           catch
           {
              return View(new PageViewModel());
           }
        }
1 голос
/ 23 января 2010

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

0 голосов
/ 03 августа 2010

для привязки модели, используйте в 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;
  }

}

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

0 голосов
/ 23 января 2010

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

        [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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...