2014-01-17 42 views
0

好吧,經過幾個小時的故障排除,我放棄了,但我相信你們都會馬上看到解決方案。我有三個模型Person,Course和CoursePreference。 CoursePreference模型有兩個外鍵PersonId和CourseId。使用局部視圖在同一視圖中創建並編制索引

我想要做什麼: 我想創建一個視圖,用戶可以在頂部創建部分添加課程首選項,當他們單擊添加時,表單將在同一視圖中發佈和刷新列表。基本上我在一個視圖中組合索引和創建。所以我在CoursePreference文件夾中創建了一個Index View和一個名爲_CreatePartial的局部視圖。

問題: 視圖顯示正常,但有兩個問題。 1)CoursePreferenceId字段顯示一個下拉列表。我希望它是一個隱藏的領域,因爲它是一個身份。我完全從腳手架創建視圖中複製了代碼,這會正確隱藏Id。不知道爲什麼它不在_CreatePartial視圖中工作? 2)最重要的是,我的_CreatePartial不會添加任何課程偏好。它看起來好像表單發佈但沒有添加記錄。

什麼給?

這裏是模型,控制器和視圖:

--------------------------- 
Models (stripped down versions) 
--------------------------- 


public class CoursePreference 
{ 
public int CoursePreferenceId { get; set; } 
public Nullable<int> CourseId { get; set; } 
public Nullable<int> PersonId { get; set; } 
public virtual Course Course { get; set; } 
public virtual Person Person { get; set; } 
} 

public class Person 
{ 
public int PersonId { get; set; } 
public string LastName { get; set; } 
public string FirstName { get; set; } 
public virtual ICollection<CoursePreference> CoursePreferences { get; set; }  
} 

public class Course 
{ 
public int CourseId { get; set; } 
public Nullable<int> ProgramId { get; set; } 
public string Name { get; set; } 
public virtual ICollection<CoursePreference> CoursePreferences { get; set; } 
} 

------------------ 
Controllers 
------------------ 

public ActionResult _CreatePartial() 
{ 
ViewBag.CourseId = new SelectList(db.Courses, "CourseId", "Name"); 
ViewBag.PersonId = new SelectList(db.People, "PersonId", "LastName"); 
return View("_CreatePartial"); 
} 

public ActionResult Index() 
{ 
ViewBag.CourseId = new SelectList(db.Courses, "CourseId", "Name"); 
ViewBag.PersonId = new SelectList(db.People, "PersonId", "LastName"); 
var coursepreferences = db.CoursePreferences.Include(c => c.Course).Include(c => c.Person); 
return View(coursepreferences.ToList()); 
} 

--------------------------- 
Index View 
--------------------------- 

@model IEnumerable<MyProj.Models.CoursePreference> 

@{ ViewBag.Title = "Index"; 
} 

<h4>Add Course Preferences</h4> 

<div> 
@Html.Partial("~/Views/CoursePreference/_CreatePartial.cshtml", new MyProj.Models.CoursePreference()) 
</div> 
<br /> 
<table class="table"> 
<tr> 
<th> 
@Html.DisplayNameFor(model => model.Course.Name) 
</th> 
<th> 
@Html.DisplayNameFor(model => model.Person.LastName) 
</th> 
<th></th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
<td> 
@Html.DisplayFor(modelItem => item.Course.Name) 
</td> 
<td> 
@Html.DisplayFor(modelItem => item.Person.LastName) 
</td> 
<td> 
@Html.ActionLink("Edit", "Edit", new { id=item.CoursePreferenceId }) | 
@Html.ActionLink("Details", "Details", new { id=item.CoursePreferenceId }) | 
@Html.ActionLink("Delete", "Delete", new { id=item.CoursePreferenceId }) 
</td> 
</tr> 
} 

</table> 
--------------------------- 
_CreatePartial View 
--------------------------- 

@model MyProj.Models.CoursePreference 

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

<div class="form-horizontal"> 
<h4>CoursePreference</h4> 
<hr /> 
@Html.ValidationSummary(true) 

<div class="form-group"> 
@Html.LabelFor(model => model.CoursePreferenceId, new { @class = "control-label col-md-2" }) 
<div class="col-md-10"> 
@Html.EditorFor(model => model.CoursePreferenceId) 
@Html.ValidationMessageFor(model => model.CoursePreferenceId) 
</div> 
</div> 

<div class="form-group"> 
@Html.LabelFor(model => model.CourseId, "CourseId", new { @class = "control-label col-md-2" }) 
<div class="col-md-10"> 
@Html.DropDownList("CourseId", String.Empty) 
@Html.ValidationMessageFor(model => model.CourseId) 
</div> 
</div> 

<div class="form-group"> 
@Html.LabelFor(model => model.PersonId, "PersonId", new { @class = "control-label col-md-2" } 
<div class="col-md-10"> 
@Html.DropDownList("PersonId", String.Empty) 
@Html.ValidationMessageFor(model => model.PersonId) 
</div> 
</div> 

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

回答

1

沒有被保存,因爲你沒有一個控制器方法處理後。在你的控制器實現這一點:

[HttpPost] 
public ActionResult Index(CoursePreference pref) 
{ 
    // Insert code to fetch database context into variable "db" 
    db.CoursePreferences.Add(pref); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

至於隱藏的ID字段,你應該使用:

@Html.HiddenFor(model => model.CoursePreferenceId)

- 不是EditorForLabelFor

+0

謝謝,這解決了保存和隱藏的領域問題。我錯誤地將我的POST代碼放入了部分視圖中。我的印象是,Partial視圖也做了插入新記錄的工作,事實上,當Index視圖/控制器執行db.Object.Add時。 Stackoverflow岩石。 – SKale