如何使用@model IEnumerable<>和@model<>在同一页面(列表/创建)MVC3

时间:2012-08-13 17:49:54

标签: asp.net-mvc-3

假设我有一个类'Location',我正在使用MVC3创建一个脚手架列表(index.cshtml)。索引html页面使用@model IEnumerable。如果我想在列表中添加一个新位置,我按下create,最后使用@model Project.Models.Location结束新的html页面。

我不想进入新页面,而是希望在boostrap(twitter)中使用modal将创建页面作为弹出窗口。我试过没有运气就使用了partialview。无论我做什么,我都会收到字典错误消息。

传递到词典中的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1 [Project.Models.Location]”,但是这需要字典类型“Project.Models.Location”的模型项

当我没有获取部分视图时,模态(引导程序)本身正在工作。 partialview本身与生成的创建(CRUD)完全相同。

编辑:我改写了整个事情。

索引:

@model IEnumerable<LoLStats.Models.Location>

@{
    ViewBag.Title = "Index";
}
@foreach (var item in Model) {
    <ul>
        <li>@Html.DisplayFor(modelItem => item.LocationName)</li>
    </ul>
}

<a class="btn" data-toggle="modal" href="#myModal" >Create</a>

<div class="modal hide" id="myModal">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal">×</button>
    <h3>Modal header</h3>
  </div>
  <div class="modal-body">
    <p>@Html.Partial("_createLocation")</p>
  </div>
  <div class="modal-footer">
    <a href="#" class="btn" data-dismiss="modal">Close</a>
    <a href="#" class="btn btn-primary">Save changes</a>
  </div>
</div>

_createLocation:

  

@model LoLStats.Models.Location

     

@ {       ViewBag.Title =“创建”; }

     

@using(Html.BeginForm()){       @ Html.ValidationSummary(真)                  位置

    <div class="editor-label">
        @Html.LabelFor(model => model.LocationName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LocationName)
        @Html.ValidationMessageFor(model => model.LocationName)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset> }

3 个答案:

答案 0 :(得分:3)

您可以制作具有两个属性的视图模型:

  • 父视图的IEnumerable
  • 模态的唯一对象

然后在视图模型中强烈键入两个视图,您应该全部设置。

修改

视图模型:

public class MyViewModel()
{
  public IEnumerable<LoLStats.Models.Location> Locations {get; set;}
  public LoLStats.Models.Location Location {get; set;}
}

指数:

@model myNamespace.MyViewModel
...
@foreach (var item in Model.Locations) {
    <ul>
        <li>@Html.DisplayFor(modelItem => item.Locations.LocationName)</li>
    </ul>
...

_createLocation:

@model myNamespace.MyViewModel
...
<div class="editor-label">
        @Html.LabelFor(model => model.Location.LocationName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Location.LocationName)
        @Html.ValidationMessageFor(model => model.Location.LocationName)
    </div>
...

希望这足以让你前进

答案 1 :(得分:2)

在索引视图中尝试此操作:

   ... <p>@Html.Partial("_createLocation", Model.FirstOrDefault())</p>

另一方面,也许这会更有意义:

   ... <p>@Html.Partial("_createLocation", new LoLStats.Models.Location())</p>

希望它适合你。

答案 2 :(得分:0)

您的弹出窗口需要将模型定义为Project.Models.Car(单数项)。成功保存单个项目后,您需要更新原始列表视图。您可以通过在DOM中插入新项目或仅通过导航到为您开始列表的操作来刷新页面来使用jQuery。