2014-09-12 2 views
1

Я действительно надеюсь, что кто-то может помочь мне с этой несколько простой вещью, которую я пытаюсь сделать. Я очень новичок в MVC, и я все еще пытаюсь обойти его!Передача параметра в Html.ActionLink, когда модель IEnumerable <T>

У меня есть контроллер под названием Подача, которая будет послана идентификатор компании, так что я могу отслеживать, какие компании мы работаем в

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> 
} 

I может видеть, как я передаю свое представлениеId для моей ссылки «Изменить», поскольку я вхожу в цикл для модели. Это прекрасно работает.

Моя проблема заключается в том, что я не могу добавить параметр в свой «Создать новый» Actionlink, например.

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

Я думаю, это потому, что у меня есть моя модель объявлена ​​как IEnumerable в верхней части, но мне это нужно, как это Переберите мои компании по ссылке редактирования. В принципе, похоже, мне нужны две версии модели, но я знаю, что это невозможно. Кто-нибудь знает, что я могу здесь сделать?

+1

Как выглядит «Создать новый» и код контроллера? Вам нужен идентификатор для этой страницы? – ekad

+0

append "@" перед тем, как решить ваш вопрос –

+0

В настоящее время моя ссылка для создания идет по адресу http: // url/Submission/Create - но я хочу использовать идентификатор (тот же, что и в ссылке «Изменить») на странице «Создать». Я могу вручную заставить его работать, выполнив это: url/Submission/Create? ReportNameid = 1 - я просто не могу получить Actionlink из Index, чтобы я мог добавить его! – levis84

ответ

0

Я предполагаю, что когда у вас есть url/Submission/Index/x где x является идентификатор компании, вы хотите сгенерируйте это как ссылку Создать: url/Submission/Create?CompanyId=x. Я бы предложил изменить класс модели на что-то вроде ниже, которое содержит CompanyID и Submissions.

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 n in db.Submissions где n.reportNameID == id select n; - он говорит, что он не может неявно преобразовать тип? – levis84

+0

См. Обновленный ответ, вам просто нужно добавить '.ToList()' – ekad

+0

Wow - вы были очень полезны - большое вам спасибо! – levis84

0

Если ваш код выглядит точно так же, как и в вашем сообщении, то это проблема, которую не могут решить Visual Studio и Razor. Вы можете, однако. Ваш код выглядит следующим образом:

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

Пожалуйста, проверьте свой код еще раз и доказательство того, что конец скобка ) отсутствует. Если это так, то просто закрытие круглой скобки вернет вам ваш Intellisense. То есть, ваш код должен выглядеть следующим образом:

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

Спасибо - ничего общего с кодом, который я создал, и никаких проблем не возникает. – levis84

+0

@ user3593088, вы не сможете обнаружить что-то не так. Парсер не может идентифицировать это как синтаксическую ошибку. Он будет отображаться только после запуска вашего просмотра. Если вы не закрываете круглые скобки, Razor не сможет понять, что у вас есть вызов функции, и будет отображать это как обычный текст, а не динамически запускать его. –

0

Я хотел бы создать ViewModel вместо того, чтобы использовать IEnumerable на вашем cshtml для начинающих.

вид Модель

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 или верхний id в Enumerable? Таким образом, свойство MaxId выше даст вам самый высокий идентификатор отправки в вашем IEnumerable. Затем вы можете изменить ссылку «Создать новую» как таковой.

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

На контроллере, вы хотите, может увеличивать это число на единицу, или что-то изменить его из MaxId

+0

Я заглянул в это да. Идентификатор, который мне нужно получить, - это текущий ReportNameId (тот, который я уже смог получить внутри цикла для ссылки «Редактировать») – levis84

+0

, но это IEnumerable, поэтому в нем может быть много сообщений. Откуда вы знаете, какой из них вы хотите использовать на ссылке Создать? Ожидаете ли вы только одного представления на этой странице? – mmeasor

+0

Я не хочу проходить через Id. Я хочу повторно использовать Id http: // myurl/Submission/Index/1 в конце этого URL-адреса и передать его в Submission/Create. Я могу вручную ввести это в url/Submission/Create? ReportNameid = 1, и он работает! – levis84