【问题标题】:Multiple Models in a single View单个视图中的多个模型
【发布时间】:2014-01-24 16:22:37
【问题描述】:

我是 MVC C# 的新手,仍在学习基础知识。

我想我已经接近得到结果,但编译器不喜欢它。

我正在尝试将 2 个模型传递到主视图中。我认为我可以使用局部视图来存储一个模型,而主视图可以使用另一个模型。比如……

// GET: /Pictures/
public ActionResult Index()
{
    //Retrieve all pictures from database
    var pictures = db.Pictures.ToList();
    return View(pictures);
}

Pictures/Index 将收到 图片模型,_Login 将收到 用户模型

@model Project1.Models.User

<div id="login">
    @if (this.Context.User.Identity.IsAuthenticated)
    {
        //Select username from email address cookie


        @Html.ActionLink("My Account", "Index", "Users", new { id = this.Context.User.Identity.Name }, false) @: | @Html.ActionLink("Logout", "Logout", "Users") 
        //
    }
else
{
    using (Html.BeginForm("Login", "Users"))
    {
        <span>
            @Html.LabelFor(u => u.Email)
            @Html.TextBoxFor(u => u.Email)
        </span>

而pictures/index.cshtml如下

@model IEnumerable<Project1.Models.Picture>
@{
    ViewBag.Title = "Animal Pictures";
}

@Html.Partial("_PictureUpload") //I thought the model would be local to _PictureUpload and then be passed?

<div id="gallery">
    @foreach (var picture in Model)
    {
        @picture.File
    }
</div>
@Html.Partial("_PictureUpload")

但 Html.Partial("_PictureUpload") 中的 Picture.cs 和 Html.Partial("_Login") 中的 Users.cs 似乎存在冲突

如何在同一个视图中拥有图片和用户模型?希望我已经解释了我的问题足以理解。

请尽可能简单,我只是想了解一下它现在是如何工作的。

【问题讨论】:

  • 您在pictures/index.cshtml 的哪个位置调用您的登录部分? Pictureupload采用什么型号?
  • 它实际上是在 _Layout.cshtml 中调用的,因为我想在所有页面上登录。实际上考虑一下,我认为图片上传会占用用户类和图片类。 -- PSEUDO CODE -- 如果没有登录,登录(使用用户类)如果登录使用图片类(接受图片数据)这是正确的做法吗?

标签: c# asp.net asp.net-mvc model


【解决方案1】:

您不能将两个模型传递到同一个视图。如果您想做您想做的事情,您需要将您的模型之一作为属性包含在您的父模型上。然后在父视图中引用父模型。当您到达要包含子模型的视图部分时,您可以调用@Html.Partial("YourPartialViewName", Model.ChildModal)。

子模态应该作为名为“YourPartialViewName”的局部视图的模型传递。当您提交到控制器操作时,这也将允许正确的模型绑定。

【讨论】:

    【解决方案2】:

    您是否尝试过创建一个具有两个属性的新模型,每个模型都有一个您想要的模型?

    但是如果你想在你的局部视图中拥有模型你需要通过它,请参考这个http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.partialview(v=vs.118).aspx

    【讨论】:

      【解决方案3】:

      您必须将模型作为主视图模型的一部分传递给 Partial:

      @model AMoreComplexModelThatHasAListOfPictureAndAPictureUploadViewModel
      @{
      ViewBag.Title = "Animal Pictures";
      }
      
      @Html.Partial("_PictureUpload", Model.PictureUploadViewModel)
      
      <div id="gallery">
      @foreach (var picture in Model.Pictures)
      {
      

      或者,您可以将部分渲染为动作,并让动作为其检索/构建模型:

      @model IEnumerable<Project1.Models.Picture>
      @{
      ViewBag.Title = "Animal Pictures";
      }
      
      @Html.RenderAction("PictureUpload");
      
      
      
      public ActionResult PictureUpload()
      {
          var model = GetMyPictureUploadViewModel();
          return PartialView("_PictureUpload", model);
      }
      

      【讨论】:

        【解决方案4】:

        您会注意到,在您的登录部分中,您从未引用过:

        @Model...
        

        实际上,您甚至没有在登录部分中使用您的用户模型。而且您不应该这样做-您必须为每一页传递模型,这太糟糕了。因此,只需删除 using 语句,您实际上就已经准备就绪。但就两个模型而言,其他答案都是正确的。

        【讨论】:

        • 我不使用 u => u.Email 和 u => u.Password 引用它吗?如果我删除 @model Project1.Models.User 它会给我一个错误
        • 对不起,是的。但是为了什么?它们只是空文本框,这就是你所需要的。
        • 我使用它将用户提交的数据传递回控制器,控制器将验证发送的数据,然后查看它是否在数据库中匹配。还是我根本不需要?
        • 'public ActionResult Login([Bind(Include="Email, Password")] User user) { if (ModelState.IsValid)'
        • 我的主要关注点是您不希望在站点中的每一个操作中都传递该模型。您可以使用 ajax 来呈现该部分,或者只使用两个无模型文本框并让您的方法接受两个字符串而不是模型。
        猜你喜欢
        • 2020-02-19
        • 1970-01-01
        • 2014-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多