2010-05-26 60 views
0

我在使用ASP.MVC中的SelectList时遇到了一些麻烦。Asp-MVC中的SelectList和数据库中的数据

这是问题:我有一个创建视图并begind一个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)。

感谢您的时间

乔治

回答

0

这应该改变从

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

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

如果我有限的理解是正确的,问题在于传递参数到控制器。您创建了一个接受DefinitionFormViewModel的视图,但是当您回发到服务器时,您当前的代码需要Definition

(如果这是不正确或downvoted,请解释,因为我也渴望学习)

+0

你好艾哈迈德。我遇到了几个麻烦。我会尝试你的解决方案,我会将其发回。 THanks – 2010-05-27 16:17:00