ASP.net MVC 3 - DropDownList在编辑期间没有更新?

时间:2011-02-25 21:31:08

标签: c# asp.net asp.net-mvc

请原谅我,因为我对使用ASP.net MVC 3相当陌生......

我有两张桌子 - 一张叫合同,一张叫做Sow。合同有一个指向SOW的外键。我想做的是能够编辑合同细节并提供不同SOW记录的下拉列表供您选择。目前的代码:

在我的合同控制员中:

public ActionResult Edit(int id)
    {
        Contract contract = contractRepository.GetContract(id);

        var db = new ManagementDataContext();
        IEnumerable<SelectListItem> items = db.Sows
            .Select(s => new SelectListItem()
            {
                Value = s.ID.ToString(),
                Text = s.Title
            });
        ViewData["Sow"] = items;

        return View(contract);
    }
[HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            Contract contract = contractRepository.GetContract(id);

            try
            {
                UpdateModel(contract);
                contractRepository.Save();

                return RedirectToAction("Details", new {id = contract.contractID});
            }
            catch
            {
                ModelState.AddRuleViolations(contract.GetRuleViolations());

                var db = new ManagementDataContext();
                IEnumerable<SelectListItem> items = db.Sows
                    .Select(s => new SelectListItem()
                    {
                        Value = s.ID.ToString(),
                        Text = s.Title
                    });
                ViewData["Sow"] = items;

                return View();
            }
        }

在我的Edit.aspx中:

<%: Html.DropDownList("Sow") %>

列表中填充了值,但是当我更改它们并更新时,外键不会更改。有什么建议或帮助吗?另外,如果你想以某种方式改进我当前的代码?

再一次,我为我缺乏ASP.net知识而道歉,但是为了学习,你必须弄脏并犯错误。

3 个答案:

答案 0 :(得分:0)

这将使用name="Sow"生成一个选择。

你想要的是与你想要绑定它的FK属性同名的输入。

可能类似于<%: Html.DropDownList("SowId") %>

答案 1 :(得分:0)

首先,我强烈建议您在AutoMapper中使用ViewModel模式。 无论如何,在你的情况下,如果你做了像

这样的事情,它应该可以工作
public ActionResult Edit(int id)
{
    Contract contract = contractRepository.GetContract(id);

    var db = new ManagementDataContext();
    IEnumerable<SelectListItem> items = db.Sows
        .Select(s => new SelectListItem()
        {
            Value = s.ID.ToString(),
            Text = s.Title
        });
    ViewData["SowItems"] = items;

    return View(contract);
}

您的观点:

<%: Html.DropDownList("SowId", ViewData["SowItems"]) %>

可能的问题可能出在ModelState上,我现在无法给你一个明确的解释。

希望对你有所帮助

答案 2 :(得分:0)

有几种方法可以尝试混合一些代码帮助。

1st:更改你的[HttpPost] Edit方法以接受Contract参数而不是FormCollection,它更清晰

[HttpPost]
public ActionResult Edit(Contract contract)

只要Contract的字段是输入字段的名称,那么您将被设置为MVC工具包将它们映射到Contract对象,然后将其传递给Action方法。 这也将允许您利用Unobtrusive Validation,这意味着MVC框架将在到达您的Action方法之前验证模型对象的数据输入。您仍然必须执行业务规则验证或数据模型关系验证,但它会有所帮助。

第二部分:我更喜欢在视图中创建SelectLists(可能会因此而被杀死),但我认为SelectList肯定是数据的View抽象,与Control或Model无关,这是一种方法,这就是ViewModel派上用场的地方 [侧面注意ViewModel,它有助于摆脱使用字符串从ViewData中取出对象,在某些情况下(比如SelectLists)需要进行转换才能编译]

控制器代码

var model = new ContractViewModel()
{
   Contract = contractRepository.GetContract(id),
   Sows = db.Sows.ToList() // ToList() is important here to ensure the data is pulled into the Model
}
// Do any other initializations here
ViewData.Model = model;
return View();

查看代码

<%= Html.DropDownListFor(model => model.Contract.Sow, new SelectList(Model.Sows, "ID", "Title")) %>

另一种选择,如果这对您不起作用或者您需要不同的验证,那么:

控制器代码

[HttpPost]
public ActionResult Edit(Contract contract, int sowID)

查看代码

<%= Html.DropDownList("sowID", new SelectList(Model.Sows, "ID", "Title")) %>

希望这有帮助。

相关问题