2014-09-12 109 views
1

我真的希望有人能夠幫助我解決這個我想要做的事情。我對MVC非常陌生,我仍然試圖讓自己的頭腦清楚!當模型是IEnumerable時,將參數傳遞給Html.ActionLink <T>

我有被傳遞公司ID,所以我可以跟蹤哪些公司,我們在工作的控制器稱爲提交

http://myurl/Submission/Index/1 

該視圖的代碼:

@model IEnumerable<Reports.Models.Submission> 

@{ 
    ViewBag.Title = "Index"; 
} 

<p>@Html.ActionLink("Create New", "Create")</p> 

@foreach (var item in Model) 
{ 
    <p>@Html.DisplayFor(modelItem=>item.ContactName) | @Html.ActionLink("Edit", "Edit", new {  id=item.submissionID }) </p> 
} 

我可以看到我如何通過我的「編輯」鏈接的submitId,因爲我處於模型的循環中。這工作正常。

我的問題是,我不能添加一個參數到我的「創建新的」動作鏈接,例如

<p>@Html.ActionLink("Create New", "Create",new {id=Model.[No options appear here!]}</p> 

我想這是因爲我有我的模型頂部聲明爲IEnumerable的,但我需要它這樣的循環通過我公司的編輯鏈接。基本上它看起來像我需要兩個版本的模型,但我知道這是不可能的。任何人都知道我可以在這裏做什麼?

+1

「新建」視圖和控制器代碼是什麼樣的?你需要該頁面的ID嗎? – ekad 2014-09-12 11:08:23

+0

之前附加「@」應該解決您的查詢 – 2014-09-12 11:10:16

+0

目前我的創建鏈接轉到http:// url/Submission/Create - 但我想將ID(與編輯鏈接中的編號相同)傳遞到創建頁面。我可以通過這樣手動獲取它:url/Submission/Create?ReportNameid = 1 - 我只是無法從索引獲取動作鏈接以允許我添加它! – levis84 2014-09-12 11:38:48

回答

0

,當你有url/Submission/Index/x其中x是公司ID我想,你想將其從MaxId改變將其生成爲創建鏈接:url/Submission/Create?CompanyId=x。我建議將模型類更改爲如下所示,其中包含CompanyIDSubmissions屬性。

public class SubmissionIndexModel 
{ 
    public SubmissionIndexModel() 
    { 
     this.Submissions = new List<Submission>(); 
    } 

    public int CompanyID { get; set; } 
    public List<Submission> Submissions { get; set; } 
} 

這是你的控制器代碼應該是什麼樣子

public ActionResult Index(int id) 
{ 
    SubmissionIndexModel model = new SubmissionIndexModel(); 
    model.CompanyID = id; 
    model.Submissions = (from n in db.Submissions where n.reportNameID == id select n).ToList(); 

    return View(model); 
} 

您的視圖代碼看起來應該像下面,你可以通過Model.CompanyID以創建跳轉鏈接,並通過Model.Submissions枚舉生成編輯聯繫。

@model SubmissionIndexModel 

@{ 
    ViewBag.Title = "Index"; 
} 

<p>@Html.ActionLink("Create New", "Create", new { CompanyId = Model.CompanyID })</p> 

@foreach (var item in Model.Submissions) 
{ 
    <p>@Html.DisplayFor(modelItem => item.ContactName) | @Html.ActionLink("Edit", "Edit", new { id = item.submissionID }) </p> 
} 
+0

這看起來很有希望!有一個BUT:我在使用之前使用的語法時遇到問題: model.Submissions = from db in。提交 其中n.reportNameID == id select n; - 它說它不能隱式轉換類型? – levis84 2014-09-12 13:17:20

+0

查看最新的答案,你只需要添加'.ToList()' – ekad 2014-09-12 13:19:16

+0

哇 - 你一直很有幫助 - 非常感謝你! – levis84 2014-09-12 13:42:14

0

如果您的代碼看起來和您的文章完全一樣,那麼這是Visual Studio和Razor無法解決的問題。你可以,但是。您的代碼看起來是這樣的:

<p>@Html.ActionLink("Create New", "Create", new {id=Model.[No options appear here!]}</p> 

請再次檢查你的代碼,並證明了結束括號)丟失。如果是這樣,那麼簡單地關閉括號會讓你的智能感知回來。也就是說,你的代碼應該是這樣的:

<p>@Html.ActionLink("Create New", "Create", new {id=Model.[No options appear here!]})</p> 
                        ^
                   look for this _____| 
+0

謝謝 - 與我構建項目的代碼無關,並且沒有問題出現。 – levis84 2014-09-12 11:43:30

+0

@ user3593088,你將無法發現錯誤。解析器無法將其識別爲語法錯誤。它只會在您運行視圖後纔會顯示。如果你沒有關閉括號,Razor將無法理解你有一個函數調用,並將以純文本形式呈現,而不是動態地運行它。 – 2014-09-12 11:45:55

0

我會創造的,而不是你的CSHTML對於初學者使用的IEnumerable一個視圖模型。

視圖模型

using System.Linq; 
using System.Collections.Generic; 

public class SubmissionVm { 
    public IEnumerable<Reports.Models.Submission> submissions { get; set; } 
    public int MaxId { 
     return submissions.OrderByDescending(s => s.submissionID).FirstOrDefault().submissionID; 
    } 
} 

在您CSHTML,在你創建新的鏈接後,你型號,打算,但目前還沒有屬性那裏看看,因爲模型是一個IEnumerable。也許你正試圖獲得下一個ID,或Enumerable中的頂級ID?所以上面的MaxId屬性會給你IEnumerable中最高的submissionID。然後你可以修改你的新建鏈接。

<p>@Html.ActionLink("Create New", "Create",new {id=Model.MaxId})</p> 

在你的控制,你會想一個可能增加這個數字,還是有得

+0

我已經看過這個了。我需要得到的ID是當前的ReportNameId(我已經能夠進入編輯鏈接的循環內部) – levis84 2014-09-12 11:42:55

+0

,但它是一個IEnumerable,因此它可能會有很多提交。你如何知道你想在創建鏈接上使用哪一個?你只希望在該頁面上提交一個提交? – mmeasor 2014-09-12 11:45:05

+0

我不想循環獲取Id。我想在該URL的末尾重新使用Id http:// myurl/Submission/Index/1,並將其傳遞給提交/創建。我可以在url/Submission/Create?ReportNameid = 1中手動輸入它,它可以工作! – levis84 2014-09-12 12:07:14