簡體   English   中英

MVC Razor編輯器用於列表中的最后一個對象

[英]MVC Razor EditorFor Last Object in List

我正在嘗試為集合中的最后一個子對象顯示EditorFor。 以下是訂單(父母)和保留(子代)的POCO:

public class Order
{
    public int ID {get;set;}
    public string Name {get;set;}
    ....
    public virtual List<Hold> Holds { get; set; }
}

public class Hold
{
    public int ID { get; set; }
    public int OrderID { get; set; }
    public virtual Order Order { get; set; }
    public DateTime? When { get; set; }
    public string Reason { get; set; }
}

這是我嘗試創建一個Order視圖,該視圖顯示一個Order和一個存在的最后一個Hold。 我已注釋掉最后一次無效的嘗試。

@model Order

@using (Html.BeginForm("Update", "Order", FormMethod.Post, new {}))
{
   <div class="form-group row">
      @Html.LabelFor(x => x.Name, new { @class = "col-xs-2" })
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Name, new { @class = "form-control"})
      </div>
   </div>

   <div class="form-group row">
      <label class="col-xs-2">When</label>
      <div class="col-xs-10">
         @*@Html.EditorFor(x => x.Holds.Last().When, new {})*@
      </div>
   </div>
}

Holds集合也可以為null,因此在這種情況下執行Last()會產生null異常,即使這樣做確實可行。

這似乎很簡單,我在數據庫中的幾個地方都有這種模式。 誰能推薦一種處理這種情況的好方法?

謝謝!

您應該為此使用視圖模型,因為當您將其發布回去時,您在HttpPost操作中不會得到很好的響應

public class OrderViewModel
{
    public OrderViewModel()
    {
        Order = new Order();
        Hold = new Hold();
    }
    public Order Order { get; set; }
    public Hold Hold { get; set; }
}

public ActionResult Edit(int id)
{

    var o = from o context.Order.Include("Holds").Single(id);
    var model = new OrderViewModel()
    {
        Order = o
    }
    if (o.Holds.Count() > 0)
        model.Hold = o.Holds.Last();
    return View(model);
}

然后只需使用EditorFors

@model OrderViewModel

@using (Html.BeginForm("Update", "Order", FormMethod.Post, new {}))
{
   <div class="form-group row">
      @Html.LabelFor(x => x.Order.Name, new { @class = "col-xs-2" })
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Order.Name, new { @class = "form-control"})
      </div>
   </div>

   <div class="form-group row">
      <label class="col-xs-2>When</label>
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Hold.When)
      </div>
   </div>
}

首先,應該使用LastOrDefault()而不是使用Last() LastOrDefault() ,然后進行適當的空檢查。 Last()引發一個異常,即找不到任何東西,而在這種情況下LastOrDefault只是返回null。

其次,使用Last()LastOrDefault()不會通過EditorFor生成正確的輸入名稱,因此一旦發布,modelbinder將不知道如何處理該值。 相反,您需要使用索引:

@if (Model.Holds.Any())
{
    var lastIndex = Model.Holds.Count() - 1;

    <div class="form-group row">
        <label class="col-xs-2">When</label>
        <div class="col-xs-10">
            @Html.EditorFor(x => x.Holds[lastIndex].When, new {})
        </div>
    </div>
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM