1

我的一个观点提出了四个不同实体类的零到多个对象。

我的目标是有一种简单的方法来编辑所有四种实体类型的一个共同值。

整个视图只有一个提交按钮,这个提交按钮调用一个 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();
    ....
4

2 回答 2

1

我认为整体方法可能存在问题。

如果您希望主动管理对象的已编辑状态,也许您需要一个更健壮的 ajax 解决方案。

我会亲自进行“focusOut”绑定,并在 focusOut 时调用一个独特的操作来更新该状态并且仅更新该状态。

这可能需要额外的架构开销,您不能或不会添加到您的项目中,但它会使其更加灵活。

于 2013-05-23T16:23:46.633 回答
0

您应该拥有独立于您的实体类的 ViewModel。在控制器中,您应该为您需要的任何实体提供所有必要的更新。

于 2013-05-23T16:26:33.650 回答