2013-06-28 6 views
1

Ok поэтому у меня есть 2 моделипередачи переменных/модели в MVC 4 C#

Модель Клиенты

[Table("Clients")] 
public class Clients 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 

    public int ClientID { get; set; } 

    public string Client { get; set; } 
    public string Address { get; set; } 
    public string State { get; set; } 
    public string City { get; set; } 
    public string County { get; set; } 
    public int Zip { get; set; } 
    public string Phone { get; set; } 
    public string LogoLocation { get; set; } 
    public string ContactName { get; set; } 
    public string ContactPhone { get; set; } 
    public string ContactEmail { get; set; } 
    public int Authorized { get; set; } 

    public string Note { get; set; } 
    public string Comment { get; set; } 

    public virtual ICollection<Countys> Countys { get; set; } 

} 

Модель Countys

[Table("Countys")] 
public class Countys 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 

    public int CountyID { get; set; } 
    public int ClientID { get; set; } 

    public string County { get; set; } 
    public string Note { get; set; } 
    public string Comment { get; set; } 

    public virtual ICollection<TownShips> Townships { get; set; } 

} 

** Мои Контроллер индекса Countys в это время **

 public ActionResult Index(int id) 
    { 
     var cnty = from r in db.Clients 
        where r.ClientID == id 
        select r; 

     if (cnty != null) 
     { 
      try 
      { 
       return View(cnty); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
     return HttpNotFound(); 

    } 

мой взгляд стандартный генерироваться вид:

@model OilNGasWeb.ModelData.Clients 

@{ 
ViewBag.Title = "Index"; 
} 

<h2>County's for </h2> 

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


<table> 
<tr> 

    <th> 
     @Html.DisplayNameFor(model => model.Countys.First().County) 
    </th> 

    <th> 
     @Html.DisplayNameFor(model => model.Countys.First().Note) 
    </th> 

    <th> 
     @Html.DisplayNameFor(model => model.Countys.First().Comment) 
    </th> 

</tr> 
</Table> 

ИСКЛЮЧЕНИЕ:

System.InvalidOperationException: Модель элемент передается в словарь типа «System .Data.Entity.Infrastructure.DbQuery 1[OilNGasWeb.ModelData.Clients]', but this dictionary requires a model item of type 'OilNGasWeb.ModelData.Clients'. at System.Web.Mvc.ViewDataDictionary 1.SetModel (значение объекта) в System.Web.Mvc.ViewDataDictionary..ctor (словарь ViewDataDictionary) в System.Web .Mvc.WebViewPage 1.SetViewData(ViewDataDictionary viewData) at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a. <InvokeActionResultWithFilters>b__17() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func 1 продолжение) в System.Web.Mvc.ControllerActionInvoker. <> c_ DisplayClass1a. <> c _DisplayClass1c.b_ 19() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c _DisplayClass25. <> c_ DisplayClass2a. b _20() в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c_ DisplayClass25. b _22 (IAsyncResult asyncResult);

+0

Это звучит так же, как и предыдущий вопрос, который уже имеет некоторые ответы: [как передать один-ко-многим из контроллера для просмотра в mvc4] (http://stackoverflow.com/questions/17279306/how -to-pass-one-to-many-from-controller-to-view-in-mvc4) – David

+0

Да, но это не решение для меня, я также отметил, что их нужно удалить из-за дублирования, было сказано, что оживить их и изменить весь код в вопросах не будет приемлемым. – Pakk

ответ

3

Если ваша точка зрения нуждается в Clients объект (который включает в себя перечисление Countys объектов), то вам необходимо пройти Clients объект на ваш взгляд:

public ActionResult Index(int id) 
{ 
    var client = (from r in Clients 
       where r.ClientID == id 
       select r).SingleOrDefault(); 

    if (client != null) 
    { 
     return View(client); 
    } 
    return HttpNotFound(); 

} 

И с точки зрения вы бы объявить Clients модель:

@model OilNGasWeb.ModelData.Clients 

Тогда в представлении вы бы иметь доступ к информации о Clients объекта, а также (потенциально пустой) список Countys объектов, которые он содержит. По сути, что «неправильно» с вашим кодом заключается в том, что представление логически в контексте Clients (это действительно сложно не просто сказать «клиент», вы можете захотеть работать с именами классов), но все, что вы давая это перечисление Countys объектов.

Примечание. Для более безопасного кода вы, вероятно, захотите инициализировать это перечисление независимо от его значения, если оно не заполнено в случае, если это пустой список. Вы сделали бы это в конструкторе класса.Например, если вы хотите инициализировать его в List<Countys> то конструктор может быть что-то вроде этого:

public Clients() 
{ 
    Countys = new List<Countys>(); 
} 

Таким образом, свойство никогда не null, в худшем случае это пустой список, который намного проще управлять в вид.

+0

awesome не могли бы вы дать мне образец синтаксиса о том, как добраться до данных ... Я привык к vb.net и пытаюсь использовать @ Html.DisplayFor (modelItem => item.Clients.Countys.CountyName (или w/e field) – Pakk

+0

@Pakk: Попробуйте что-то вроде: '@ Html.DisplayFor (modelItem => item.Clients.Countys.First() .Name County)' Это немного неинтуитивно, так как можно было бы ожидать * '.First() 'для исключения исключений в пустом списке, но в этом случае метод хелпер-кода на самом деле не выполняет эту строку. Он просто следует за ссылочным типом посредством отражения. Поэтому даже в пустом списке' .First() 'должен работать этот случай. (Хотя на основе вашего кода я не уверен, что тип 'item' в этом примере. Я ожидал бы что-то вроде' Model.Countys.First(). CountyName', но я не могу быть уверен.) – David

+0

ОК, я изменил свой код, не могли бы вы посоветовать, почему он не работает? Или это будет другой вопрос? – Pakk