【问题标题】:IEnumerable Error on View with Partial Load部分负载视图上的 IEnumerable 错误
【发布时间】:2019-06-17 09:10:03
【问题描述】:

我正在尝试在我的应用程序中创建一个视图,该视图在 ASP.NET Core 中执行基本的 CRUD 命令,以自学一些新技能。然而,我被困住了,希望能得到一些帮助。

我希望应用程序的每个“组件”都处于局部视图中,以便继续进行维护。我最初让我的 Index 视图使用 IEnumerable 类型的声明(对于 for each 循环):

@model IEnumerable<Project.Web.Models.Sample.SampleModel>

这对于返回列表和呈现页面非常有效,但是当尝试将我的模态窗口部分加载到页面中并使用控制器上的“CreateSample”函数插入数据时,它没有选择该函数并且失败了插入(未找到表单操作)。如果我再尝试添加:

@model Project.Web.Models.Sample.SampleModel

到 CreateModal 视图页面,它会抛出一个错误,甚至不会让我渲染页面,我想是因为它被部分加载,应用程序被视为具有两个 SampleModel 声明。如果我创建这个页面完全独立并且没有部分加载正常的@model 声明它可以工作。

到目前为止,我已经完成了基本设置,并在下面包含了我的代码。

模型 - SampleModel

public class SampleModel
    {
        public int Id { get; set; }
        public string SampleText { get; set; }
    }

控制器 - SampleController

public class SampleController : Controller
    {
        public const string ControllerName = "Sample";
        //Open Database Connection
        private _DBContext DBDatabase = new _DBContext ();

        public ActionResult Index()
        {
            var Model = DBDatabase.Sample.Select(s => new SampleModel
            {
                Id = s.Id,
                SampleText = s.SampleText
            }).ToList();

            return PartialView(Model);
        }

        [ActionName("_CreateModal")]
        public ActionResult InsertNewRecord()
        {
            var Model = DBDatabase.Sample.Select(s => new SampleModel
            {
                Id = s.Id,
                SampleText = s.SampleText
            }).ToList();

            return PartialView("_CreateModal", Model);
        }

视图 - 索引、视图、创建

Index - 调用局部视图进行查看和创建

@using Project.Web.Controllers
@model Project.Web.Models.Sample.SampleModel
<!--html stuff here -->
@await Html.PartialAsync("_CreateModal")
<!--more html stuff here -->
@await Html.PartialAsync("_ViewData")

查看 - Foreach 循环记录

@model Project.Web.Models.Sample.SampleModel

<table style="width: 100%;" id="example">
    <thead>
        <tr>
            <th>#</th>
            <th>Sample Text</th>
            <th class="text-center">Status</th>
            <th class="text-center">Actions</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var sample in Model)
        {
            <tr>
                <th scope="row">@sample.Id</th>
                <td>@sample.SampleText</td>
                <td class="text-center">
                    <div class="badge badge-success">Active</div>
                </td>
                <td class="text-center">
                    <div role="group" class="btn-group-sm btn-group">
                        <button class="btn-shadow btn btn-primary">Edit</button>
                        <button class="btn-shadow btn btn-primary">Delete</button>
                    </div>
                </td>
            </tr>
        }
    </tbody>
</table>

创建 - 插入新记录

@model Project.Web.Models.Sample.SampleModel

<form method="post" asp-action="/SampleModel/CreateSample">
                    <div class="form-group">
                        <label for="CreationTime">SampleText</label>
                        <div>
                            <input type="text" class="form-control" id="SampleText" name="SampleText" placeholder="SampleText">
                        </div>
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-primary">Sign up</button>
                    </div>
                </form>

【问题讨论】:

  • 您的 Create partial view 期望其模型的类型为 SampleModel,但您传递给它的是 List&lt;SampleModel&gt;
  • 谢谢 Ammar,我现在通过为 SampleModal 创建标准列表解决了这个问题。拥有太多@model 声明的问题现在仍然存在。公共 ActionResult _CreateModal() { return View(); }
  • 您需要传递一个空模型来创建视图,并且视图也需要声明。此外,您的视图循环模型但它不是一个列表,这也会导致错误。我们是能够将模型直接传递给partial views,例如@await Html.PartialAsync("_PartialName", model)
  • 谢谢大家。如上所述,我开始制作另一个模型并将该模型传递给新的局部视图。这解决了我的问题:)

标签: c# asp.net-core model-view-controller partial-views


【解决方案1】:

根据 Ammar 的评论,您刚刚复制粘贴了索引控制器的数据访问权限。在构建允许用户创建单个新项目的表单时,模式通常是预先实例化一个空模型并将其传递给视图:

[ActionName("_CreateModal")]
public ActionResult InsertNewRecord()
{
    var model = new SampleModel(); // If Id is a GUID, then you could assign one here

    return PartialView("_CreateModal", model);
}

【讨论】:

  • 谢谢斯图尔特。愚蠢的我没有拿起那个。我已根据您和 Ammar 的回复进行了调整。这是否意味着我的 CreateModal 窗口仍需要 @model/controller 减速才能在控制器中达到该功能?如果我将@model 声明添加到弹出的模态窗口中,则该站点会呈现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多