MVC 5 局部视图 - 模型混淆

MVC 5 Partial View - Model confusion

我有一个模型叫做 "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,要么出现以下错误:

Models.Slider 的 LIST 无法分配给类型 models.Slider

非常感谢 西蒙

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

您的控制器将执行如下操作:

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 语句。

您正在尝试将列表分配给模型,但您声明了一个非列表类型的模型,因此您要么想将其声明为列表类型,要么 select 结果中的 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;
}