1

我正在开发一个小应用程序,以便更好地了解 MVC3 和 Razor 的工作原理。我正在使用 MVC3,所有代码都是自动生成的(通过 T4 的 dbContext,通过添加控制器的控制器,来自 EDMX 模型的 Databese...)。

在我的模型中,我有这个简单的模型:http: //i.stack.imgur.com/nyqu4.png

public partial class Application
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ApplicationType ApplicationType { get; set; }
}

public partial class ApplicationType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

如您所见,ApplicationType 基本上是一个枚举(遗憾的是 EF 4 不支持枚举)。所以,在我的 ApplicationController 我有这个:

public ActionResult Create()
{
    ViewBag.AppTypes = new SelectList(db.ApplicationTypes.OrderBy(c => c.Type), "Id", "Type");
    return View();
} 

[HttpPost]
public ActionResult Create(Application application)
{
    if (ModelState.IsValid)
    {
        db.Applications.Add(application);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(application);
}

在我看来:

@Html.DropDownListFor(model => model.ApplicationType.Id, (SelectList)ViewBag.AppTypes, "Choose...")

现在我面临两个问题:

1) 未填充 ApplicationType:

由于@Html.DropDownListFor 仅呈现一个简单的选择,它填充ID,但不填充Type 属性,如下所示(对不起,我无法发布图像,因为我是新来的):

http://i.stack.imgur.com/96IR1.png

图中可以看到ID是ok的,但是Type是空的。

我做错了什么?

2) 重复数据

第二个问题是,如果我在调试期间手动填充 Type 属性(模拟正确的工作流场景),ApplicationType 将在数据库中复制,而不是仅引用旧注册表。

那么,如何使 @Html.DropDownListFor 引用以前的现有项目而不是创建新项目?

谢谢你的帮助!

4

2 回答 2

0

你有没有尝试过:

@Html.DropDownListFor(model => model.ApplicationType.Id, m => m.ApplicationType.Type, "Choose...")

注意第二个参数的变化。

于 2012-04-25T21:39:47.903 回答
0

我相信您犯的错误是在视图中使用域模型并假设在发布后整个模型应该完全绑定并准备好存储在数据库中。虽然可以在视图中使用域模型,但更好的做法是创建单独的视图模型

例如 :

public class ApplicationViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }

    public SelectList ApplicationTypeList { get; set; }
    public string ApplicationTypeId { get; set; }
}

在您看来:

@Html.DropDownListFor(model => model.ApplicationTypeId, Model.ApplicationTypeList , "Choose...")

在您的控制器中

[HttpPost]
public ActionResult Create(ApplicationViewModel model)
{
    if (ModelState.IsValid)
    {
        Application application = new Application()
        {
           Id = model.Id,
           Name = model.Name,
           ApplicationType = db.ApplicationTypes
              .First(a => a.Id == model.ApplicationTypeId);

        };
        db.Applications.Add(application);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(model);
 }

然后,您可以验证您的 View Model 的 ApplicationTypeId 是否对应于您的模型状态验证的真实应用程序类型部分。您可以使用AutoMapper加快将视图模型转换为域模型的过程。

于 2012-04-26T16:41:15.670 回答