SelectList в Asp-mvc и данные из базы данных - PullRequest
0 голосов
/ 26 мая 2010

У меня проблемы с SelectList в ASP.MVC.

Вот в чем проблема: у меня есть Create View и мне нужна модель ViewModel.

Страница загружается просто отлично (GET глагол). Но при публикации что-то происходит, и моя модель считается недействительной, и она не может быть вставлена. Вот что я пробовал до сих пор.

public class DefinitionFormViewModel
{
    private Repository<Category> categoryRepository = new Repository<Category>();
    public Definition ViewDefinition { get; private set; }
    public SelectList Categories { get; private set; }

    public DefinitionFormViewModel(Definition def)
    {
        ViewDefinition = def;

        // here i wanted to place it directly, like shown in NerdDinner Tutorial
        // new SelectList(categoryRepository.All(),ViewDefinition.Category);


        Categories = new SelectList(categoryRepository.All(), "CategoryId", "CategoryName", ViewDefinition.CategoryId);
    }
}

// pageview which inherits DefinitionFormViewModel
        <div class=editor-field">
            <%= Html.DropDownList("Category",Model.Categories) %>
            <%= Html.ValidationMessageFor(model => Model.ViewDefinition.Category) %>
        </div>

// controller methods
    [Authorize]
    public ActionResult Create()
    {
        Definition definition = new Definition();

        return View(new DefinitionFormViewModel(definition));
    }

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Create(int id,Definition definition)
    {
        Term term = termRepository.SingleOrDefault(t => t.TermId == id);

        if (term == null)
        {
            return View("NotFound", new NotFoundModel("Termo não encontrado", "Termo não encontrado",
            "Nos desculpe, mas não conseguimos encontrar o termo solicitado.", "Indíce de Termos", "Index", "Term"));
        }
        else
        {
            if (ModelState.IsValid)
            {
                try
                {
                    definition.TermId = term.TermId;
                    definition.ResponsibleUser = User.Identity.Name;

                    UpdateModel(definition);

                    term.Definitions.Add(definition);

                    termRepository.SaveAll();

                    return RedirectToAction("Details", "Term", new { id = term.TermId });
                }
                catch (System.Data.SqlClient.SqlException sqlEx)
                {
                    ModelState.AddModelError("DatabaseError", "Houve um erro na inserção desta nova definição");
                }
                catch
                {
                    foreach (RuleViolation rv in definition.GetRuleViolations())
                    {
                        ModelState.AddModelError(rv.PropertyName, rv.ErrorMessage);
                    }
                }
            }
        }
        return View(new DefinitionFormViewModel(definition));
    }

Извините за длинный пост, но я не могу понять это. Я не получил никаких графических ошибок или исключений. Мое выполнение заканчивается в if (ModelState.IsValid).

Спасибо за ваше время

George

1 Ответ

0 голосов
/ 27 мая 2010

Это должно измениться с

[AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Create(int id,Definition definition)
    {...}

до

 [AcceptVerbs(HttpVerbs.Post), Authorize]
        public ActionResult Create(int id,DefinitionFormViewModel definition)
        {...}

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

(Если это неверно или недооценено, пожалуйста, объясните, как я тоже хочу учиться)

...