我的一个观点提出了四个不同实体类的零到多个对象。
我的目标是有一种简单的方法来编辑所有四种实体类型的一个共同值。
整个视图只有一个提交按钮,这个提交按钮调用一个 ActionResult 对所有可编辑值所做的更改都应该这样存储(注意:这不起作用,因为签名似乎无效):
public ActionResult SaveBloombergTickers(IEnumerable<StockPosition> stockpositions, IEnumerable<BondPosition> bondposition, ...)
{
if (ModelState.IsValid)
{
foreach (var stockposition in stockpositions)
{
db.Entry(stockposition).State = EntityState.Modified;
db.SaveChanges();
}
foreach (var bondposition in bondpositions)
{
db.Entry(bondposition).State = EntityState.Modified;
db.SaveChanges();
}
return RedirectToAction("Index");
}
return View("Index");
}
问题1:我觉得这是实现我想要的一种愚蠢的方式。不幸的是,我不知道有任何“最佳实践”。你是?
问题 2:在这种情况下,ActionResult 的有效签名是什么样的?
解决方案(感谢 David L 给我的想法):
1)在构建视图时将必要的数据(当前元素的 ID)附加到文本框:
<input type="text" class="updateBloombergTicker StockPosition"
data-key="@stockposition.StockPositionID" style="width: 100px;"
value="@stockposition.BloombergID"/>
2)在文本框模糊上,触发相应的 Ajax 事件(我为此使用了一个函数“AJAX”)并将必要的信息交给控制器:
$(".updateBloombergTicker").blur(function () {
$this = $(this);
if ($this.hasClass("StockPosition")) {
AJAX("../Excel/UpdateStockPositionTicker",
{
key: $this.attr("data-key"),
ticker: $this.val()
}
);
}
if ($this.hasClass("BondPosition")) {
.......
3)控制器完成剩下的工作:
[HttpPost]
public ActionResult UpdateStockPositionTicker(string key, string ticker)
{
if (ModelState.IsValid)
{
var stockposition = db.StockPositions.Find(Convert.ToInt32(key));
stockposition.BloombergID = ticker;
db.SaveChanges();
....