Почему мой контроллер MVC получает нулевую Umbraco RenderModel? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть главное представление в моем решении MVC, для которого требуются данные (компании) из отдельной базы данных в базу данных Umbraco CMS.

Shared \ Master.cshtml

@inherits Umbraco.Web.Mvc.UmbracoViewPage<MyCode.Web.Portal.Models.Master>
<!DOCTYPE html>
<html>
    <head>
        <title>@Umbraco.Field("title")</title>
    </head>
    <body>
        <div>
            <span>
                <h1>@Umbraco.GetDictionaryValue("Application Name")</h1>
            </span>
            <span>
                    <h1>@Umbraco.GetDictionaryValue("Company"):</h1>
                <!--This is the data from a separate database.-->
                @Html.DropDownListFor(model => model.SelectedCompany, new SelectList(Model.Companies))
            </span>
        </div>
        @Html.Partial("Navigation")
        <div class="container">
            @Html.Partial("Breadcrumb")
            <div class="body-content">
                <!--This is where I expect the Umbraco view to be nested.-->
                @RenderBody()
            </div>
        </div>
    </body>
</html>

У меня тогда есть представления шаблонов в Umbraco, которые используют этот мастер-вид в качестве макета.

ChildNodeSelectionPage.cshtml

@{
    Layout = "Shared/Master.cshtml";
}
<img src="@Model.Content.GetProperty("icon")"/>
<h2>@Model.Content.GetProperty("title")</h2>
@Html.Raw(Model.Content.GetProperty("description"))
@Html.Partial("Child Node Grid")

Когда контроллер должен генерироватьэто представление (документ с именем Home, который использует ChildNodeSelectionPage.cshtml в качестве своего шаблона) является первым попаданием, модель пуста, и я не могу его создать!Что мне нужно сделать, чтобы модель не была нулевой?

MVC Home Controller:

public class HomeController : RenderMvcController
{
    private ActionResult Index(IPublishedContent content, CultureInfo currentCulture)
        => CurrentTemplate
        (
            new Master
            (
                content,
                currentCulture,
                new Company(0, "Automobilli Lamborghini Spa"),
                new[]
                {
                    new Company(0, "Automobilli Lamborghini Spa"),
                    new Company(1, "Ital Design")
                }
            )
        );

    public override ActionResult Index(RenderModel model)
        //The model is null, the PublishedContentRequest is null and Umbraco.TypedContentSingleAtXPath fails!  I can't even hack myself a fresh model!
        => Index
        (
            model?.Content ?? UmbracoContext.Current.PublishedContentRequest?.PublishedContent ?? Umbraco.TypedContentSingleAtXPath("Home"),
            model?.CurrentCulture ?? UmbracoContext.Current.PublishedContentRequest?.Culture ?? CultureInfo.CurrentUICulture
        );
    }
}

Основная модель:

public class Master : RenderModel
{
    public Company SelectedCompany { get; }
    public IEnumerable<Company> Companies { get; }

    public Master
    (
        IPublishedContent content,
        CultureInfo culture,
        Company selectedCompany,
        IEnumerable<Company> companies
    )
        : base
        (
            content,
            culture
        )
    {
        SelectedCompany = selectedCompany;
        Companies = companies;
    }
}

Обратите внимание, что я новичок в Umbraco и все еще пытаюсь найти наилучший способ интеграции его с существующим веб-сайтом MVC.Если подход, который я здесь использовал, неверен, не стесняйтесь предложить другой, чтобы предотвратить эту проблему, возникающую у меня с контроллером, который не получает модель.

1 Ответ

0 голосов
/ 23 ноября 2018

Проблема была в моем файле RouteConfig.cs, в котором я звонил MapRoute, что, в свою очередь, переопределяло собственную маршрутизацию Umbraco и, таким образом, не позволяло ему передавать модель для своего шаблона.Я удалил этот вызов и переименовал свой HomeController в соответствии с именем шаблона Umbraco, который я использовал для домашней страницы, и тогда Umbraco смог сам вызывать метод Index, одновременно передавая RenderModel.

Мой класс RouteConfig теперь выглядит следующим образом:

public static class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //This code was the source of the problem.
        //routes.MapRoute
        //(
        //  name: "Default",
        //  url: "{controller}/{action}/{id}",
        //  defaults: new
        //  {
        //      controller = "Home",
        //      action = "Index",
        //      id = UrlParameter.Optional
        //  }
        //);
    }
}

Убедитесь, что имя этого контроллера совпадает с именем файла шаблона Umbraco, используемого в документе Umbraco, но добавьте к нему слово «Controller»..

//Previously named HomeController.
public class ChildNodeSelectionPageController : RenderMvcController

Теперь соответствует имени файла шаблона + «Контроллер» (см. Редактируемое текстовое поле «Страница выбора дочернего узла»).

Umbraco Template Name

Это «Домашний» документ Umbraco, использующий этот шаблон.

Umbraco Document using Template

...