请原谅我,因为我对使用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知识而道歉,但是为了学习,你必须弄脏并犯错误。
答案 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")) %>
希望这有帮助。