2014-02-18 39 views
0

這是簡單化了的場景:如何在一個一對多的關係發表評論添加到實體

我有一個類Device

[Key] 
public int Id { get; set; } 
[MaxLength(50)] 
public String Name { get; set; } 
[Required] 
public Category Category { get; set; } 
[Required] 
public Manufactor Manufactor { get; set; } 
public virtual ICollection<Comment> Comments { get; set; } 
public virtual ICollection<Status> Status { get; set; } 

和A類Comment

public int ID { get; set; } 
public string Content { get; set; } 
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
public DateTime DateCreated { get; set; } 
public string Author { get; set; } 
public virtual Device Device { get; set; } 

正如你所看到的設備的實體可以有很多評論,但一個評論只有一個設備。

在我的控制器我有這兩個動作:

public ActionResult AddComment(int id) 
    { 
     Device device = db.Devices.Include(x => x.Comments).Where(dev => dev.Id == id).FirstOrDefault(); 
     if (device == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(device); 
    } 

    [HttpPost, ActionName("CommentAdded")] 
    public ActionResult CommentAdded(int id) 
    { 
     Device device = db.Devices.Find(id); 
     db.Entry(device).State = EntityState.Modified; 
     db.Devices.AddOrUpdate(device); 

     foreach(var comment in device.Comments) 
     { 
      db.Comments.AddOrUpdate(comment); 
     } 

     db.SaveChanges(); 

     return View("Index"); 
    } 

到現在爲止一切都顯得直截了當。但是suddently我不知道如何創建一個視圖中,我能做到這三兩件事:

  1. 顯示設備
  2. 顯示的名稱所有評論
  3. 顯示一個文本框添加其他評論

我可以輕鬆實現1和2,但我不知道如何添加其他評論,然後提交表單。

AddComment.cshtml:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Device</h4> 
     <hr /> 
     @Html.ValidationSummary(true) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) 
      <div class="col-md-4"> 
       @Html.DisplayFor(model => model.Name) 
      </div> 
      <div class="col-md-6"> 
      <br/> 
      <div class="row"> 
       @Html.EditorFor(model => model.Comments) 

      </div> 
      @foreach (var comment in Model.Comments) 
      { 
       <div class="row"> 
        <div class="col-md-4"> 
         <strong> 
          @Html.DisplayFor(model => comment.Author) 
         </strong> 
        </div> 
        <div class="col-md-4"> 
         <strong> 
          @Html.DisplayFor(model => comment.DateCreated) 
         </strong> 
        </div> 
        <div class="col-md-4"> 

        </div> 
       </div> 
       <div class="row"> 
        <div class="col-md-12"> 
         <p> 
          @Html.DisplayFor(model => comment.Content) 
         </p> 
        </div> 
       </div> 

      } 
     </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

眼下的問題是:我需要什麼,我認爲(POS控制器)來改變,才能夠添加到設備的另一個選擇評論?

+0

與代碼相關但不是問題的癥結:在上下文中的DbSets上使用AddOrUpdate時要小心。這種擴展方法真的是用於遷移,並不總是像在播種領域之外期望的那樣行事。 –

回答

0

沿着這些線的東西。只需要創建一個html表單並將表單字段映射到ajax函數。然後在提交表單時調用該函數。

希望有幫助。

[HttpPost] 
public ActionResult AddComment(int id,Comment comment) 
{ 
    Device device = db.Devices.Find(id); 
    comment.DateCreated = DateTime.Now; 
    Device.Comment.Add(comment); 
    db.Entry(device).State = EntityState.Modified; 

    db.saveChanges(); 


    return Json("Success"); 
} 


$.ajax({ 
     type: "POST", 
     url: "/AddComment", 
     data: { Id: '@Html.IdFor(m => m.Id)', 
     Comment: { Content: 'data', Author: 'Author'} }, 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
     if (data == "Success") { 
      $('#COMMENTSDIV').append(" YOUR COMMENTS MARKUP HERE "); 
      } 
     } 
     }); 
+0

我們可以保持它直線上Razor-syntax/js-free嗎? – Marco

0

您只需要在表單中添加註釋功能,然後通過相應的操作將其添加回服務器。如果您願意,該操作可以返回帶有新評論的整個視圖。

相關問題