【问题标题】:MVC 5 Partial View - Model confusionMVC 5 局部视图 - 模型混淆
【发布时间】:2015-09-20 15:00:39
【问题描述】:

我有一个名为“Slider”的模型

using System;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;

namespace BarMotors.Models
{
public class Slider
{
    public virtual int Id { get; set; }
    public virtual string Photo{ get; set; }
    public virtual string LeftText{ get; set; }
    public virtual string RightText { get; set; }
    public virtual int SortOrder{ get; set; }
    public virtual DateTime CreatedAt { get; set; }
    public virtual DateTime? UpdatedAt { get; set; }
    public virtual DateTime? DeletedAt { get; set; }

    public virtual bool IsDeleted
    {
        get { return DeletedAt != null; }
    }
}

public class SliderMap : ClassMapping<Slider>
{
    public SliderMap()
    {
        Table("Sliders");
        Id(x => x.Id, x => x.Generator(Generators.Identity));
        Property(x => x.Photo, x => x.NotNullable(true));
        Property(x => x.LeftText);
        Property(x => x.RightText);
        Property(x => x.SortOrder, x => x.NotNullable(true));
    }
}
}

我也(现在)有这个控制器;

using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using BarMotors.Models;
using NHibernate.Linq;

namespace BarMotors.Controllers
{
    public class SliderController : Controller
    {
        [ChildActionOnly]
        public ActionResult Sliders()
        {
            List<Slider> model;
            new List<Models.Slider>();
            model = Database.Session.Query<Slider>().Where(s => s.DeletedAt == null).OrderBy(x=>x.SortOrder).ToList();

            return PartialView("_HomeSlider", model);
        }
    }
}

主视图

@{
    ViewBag.Title = "Homepage";
}
<h1>Homepage</h1>
@Html.Action("Sliders", "Slider")

局部视图

@model BarMotors.Models.Slider

@{
    Layout = null;
}
//do something in loop of Slider

在 SliderController 中,我无法将 var 模型传递给局部视图,我得到 Iqueryable、ienumerable 或错误;

LIST of Models.Slider 不可分配给类型 models.Slider

非常感谢 西蒙

【问题讨论】:

    标签: c# asp.net-mvc partial-views


    【解决方案1】:

    您正在尝试将列表分配给模型,但您声明了一个不是列表类型的模型,因此您想要将其声明为列表类型或从结果中选择 firstordefault

    public class MyController : Controller
    {
        /* ... your code ... */
    
        [ChildActionOnly]
        public ActionResult Sliders()
        {
            var model = new Models.Slider();
    
            model = Database.Session.Query<Slider>().Where(s => s.DeletedAt == null).OrderBy(x=>x.SortOrder).ToList().FirstOrDefault();
    
            return PartialView("your-view-name", model);
        }
    }
    

    否则

    public class MyController : Controller
    {
        /* ... your code ... */
    
        [ChildActionOnly]
        public ActionResult Sliders()
        {
            var model = new List<Models.Slider>();
    
            model = Database.Session.Query<Slider>().Where(s => s.DeletedAt == null).OrderBy(x=>x.SortOrder).ToList();
    
            return PartialView("your-view-name", model);
        }
    }
    

    而在部分视图中,您必须将其更改为

    @model List<BarMotors.Models.Slider>
    
    @{
        Layout = null;
    }
    

    【讨论】:

    • return PartialView("_HomeSlider", model); 仍在告诉我; List 不可分配给类型 Models.slider
    • 那么您可能在 View 中使用相同的。您可以发布您的部分视图
    • 所有代码都添加到我的原始帖子中。我想我只是想念一件小事——我只是不知道我哪里出错了。
    • 更新答案请查收
    • 愚蠢的我!我忘了将我的新映射添加到我的 nHibernate.Configure 方法中!!!哈哈
    【解决方案2】:

    如果您的滑块与父模型无关,您可能希望使用子操作。

    你的控制器会有这样的动作:

    public class MyController : Controller
    {
        /* ... your code ... */
    
        [ChildActionOnly]
        public ActionResult Sliders()
        {
            var model = new Models.Slider();
    
            /* ... populate model ... */
    
            return PartialView("your-view-name", model);
        }
    }
    

    您将使用HtmlHelper.Action() 方法从父视图中请求子操作:

    <div>
        <!-- more view markup ... -->
    
        @Html.Action("sliders", "my")
    
    </div>
    

    当您以这种方式调用Html.Action 方法时,生成的视图(通常是局部视图)会在当前视图中就地呈现。如果你熟悉 PHP,它有点类似于 include 语句。

    【讨论】:

    • 所以,没有视图模型,但“我的”肯定应该是某种模型吗?
    • 没有。像这样调用 Html.Action 最多需要一些参数。它不像 Html.Partial,它确实使用了模型。
    • 所以我明白了什么是“我的”——它指的是什么?谢谢西蒙
    • 你正在调用一个动作。第一个参数是动作,第二个是控制器。示例代码使用 MyController,因此第二个参数是“my”。
    • 啊哈,我不知道是 cpoy 和粘贴错字还是什么的。感谢您解决这个问题。
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2023-03-28
    • 2014-06-27
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多