【问题标题】:ASP.NET wrong model typeASP.NET 错误的模型类型
【发布时间】:2020-01-29 00:51:20
【问题描述】:

我正在开发一个网站,但我正在努力处理传递给我的视图的模型。我最终测试了它是否以最基本的方式工作,以确保我没有做任何明显错误的事情。还是不行:

我的控制器:

public class HomeController : Controller
{
    public ActionResult Test()
    {
        List<Model_Test> model = new List<Model_Test>
                {
                new Model_Test{Name = "Henri", Age = 24, City = "Paris"},
                new Model_Test{Name = "Jacob", Age = 18, City = "Caen"},
                new Model_Test{Name = "Patrick", Age = 57, City = "Lille"},
                new Model_Test{Name = "Youri", Age = 13, City = "Bordeaux"},
                };
        return View(model);
    }
}

我的模特:

public class Model_Test
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}

我的视图是我通过右键单击 ActionResult Test() 创建的视图。我将其设置为 List 并以 Model-test 作为模型。

@model IEnumerable&lt;AVdevWebsite.Models.Model_Test&gt;

但由于出现此错误,我无法显示我的小列表:

传入字典的模型项的类型为“System.Collections.Generic.List”1[AVdevWebsite.Models.Model_Test]”,但此字典需要类型为“AVdevWebsite.Models.Model_User”的模型项。

谢谢!

编辑:

主视图:

<!-- #region Modal -->
                        using (Html.BeginForm())
                        {
                            @model AVdevWebsite.Models.Model_User

                            @Html.AntiForgeryToken()

                            <div class="modal fade" id="LoginModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
                                 aria-hidden="true">
                                <div class="modal-dialog" role="document">
                                    <div class="modal-content">
                                        <div class="text-center">
                                            <div class="form-signin">
                                                <img class="mb-4" src="~/Content/Images/User_Icon.png" width="72" height="72" />
                                                <h2 class="h3 mb-3 font-weight-normal">Se Connecter</h2>
                                                <hr />
                                                @if (Session[ErrorAlerts.ERRORALERT] != null)
                                                {
                                                    <div class="alert alert-danger" role="alert">@Session[ErrorAlerts.ERRORALERT]</div>
                                                }

                                                @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                                                @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "sr-only" })
                                                @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control", @placeholder = "Identifiant" } })
                                                @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })


                                                @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "sr-only" })
                                                @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", @placeholder = "Mot de Passe" } })
                                                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })

                                                <hr />

                                                <button class="btn btn-lg btn-primary" type="submit">Login</button>
                                                <a class="disabled btn btn-lg btn-primary">Invité</a>

                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        }
                        <!-- #endregion -->

这是部分视图:

@model IEnumerable<AVdevWebsite.Models.Model_Test>

@{
    ViewBag.Title = "Test_ManageUsers";
}

<h2>Test_ManageUsers</h2>

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

错误是由于主视图要求@model。

【问题讨论】:

  • 根据提供的代码,这看起来是正确的。您在视图顶部没有重复的“@model”语句或奇怪的东西?您确定它使用了正确的视图吗?尝试显式指定视图 View("Test", model),假设视图在 Views 文件夹中正确命名为“Test.cshtml”。
  • 你的控制器正在使用Model_Test,而视图期望Model_User。因此,@BryanLewis 建议检查您是否“加载”了正确的视图。
  • 还要检查您的视图,看看是否有其他视图正在其中呈现。您的 Controller 和 View 模型关联可能是同步的,但您的主视图可能会将其模型传递到另一个期望不同类型模型的视图。 (例如,您的视图是否通过期望 Model_User 类型模型的局部视图显示用户信息?)
  • 感谢大家的快速反应。你是对的@Steven,我的主要布局使用模型 Model_User 作为模态表单,我只需要关注它的范围对吗?
  • 添加部分视图的代码以及包含它的主视图中的行。

标签: asp.net-mvc


【解决方案1】:

我在理解所有这些特定部分如何组合在一起时遇到了一些麻烦,因此我将尝试提供一些通用的 MVC 技巧。

MVC 工作的前提是 View 规定所请求信息的布局/呈现细节,Model 表示请求的数据,而 Controller 负责构建 Model 并将其提供给 View 以生成响应。

在结构上,可以将视图视为组件,并且可以从多个视图组件创建“最终”视图。不过,视图通常是针对特定的模型类型进行编码的,因此将视图组件嵌套在一起很快就会变得有点复杂。

据我所知,有几种方法可以处理这种情况。

1) 通过复杂的模型对象。您可以将模型定义为您需要的任何内容,并且您需要确保您的模型具有您的视图所需的所有“东西”。如果视图中嵌套了部分视图,则可以设计一个复杂的主模型来保存子视图组件所需的所有模型信息。

在这种情况下,您的模型可能看起来像这样(注意:Model_Test 有一个名为 User 的 Model_User 属性):

public class Model_User
{
    // Properties go here...
}

public class Model_Test
{
    public Model_User User { get; set; }

    // Properties go here...
}

您的用户视图可能如下所示:

@model WebApplication1.Models.Model_User

@*View stuff goes here*@

您的测试视图可能如下所示:

@model WebApplication1.Models.Model_Test

<h2>Test</h2>

@Html.Partial("User", Model.User)

为了支持这一点,您的控制器需要在创建 Test_Model 的过程中创建 User_Model:

    public ActionResult Test()
    {
        // Build user model here
        var userModel = new Model_User();

        // Build test model so that it contains the user model
        var model = new Model_Test();
        model.User = userModel;

        return View(model);
    }

2) 或者,您可以通过单独的操作方法将处理模型构建的责任委托给控制器。这样,主模型不一定必须包含所有子视图“东西”,它可以调用适当的控制器操作并让它处理。

在这种情况下,您的主要模型不那么复杂;它可以更符合它直接支持的视图的流线型,但缺点可能是隐藏的复杂性和服务器操作的重复。

对于这种方法,您的代码可能如下所示:

为此,模型可以保持更简单(注意:在这种情况下,Model_Test 不必了解有关 Model_User 的任何信息)

public class Model_User
{
    // Properties go here...
}

public class Model_Test
{
    // Properties go here...
}

控制器将有一个新操作,为用户生成部分视图(并处理构建支持模型)

public ActionResult User()
{
    // Build user model here
    var model = new Model_User();
    return PartialView(model);
}

public ActionResult Test()
{
    // Build test model here.  Model doesn't have to "know" anything about user details
    var model = new Model_Test();
    return View(model);
}

Test 视图依赖于 Controller 通过该 Action 完成这项工作:

@model WebApplication1.Models.Model_Test


<h2>Test</h2>

@Html.Action("User")

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多