Бритва - Могу ли я сделать дополнительную модель для вида? - PullRequest
3 голосов
/ 02 апреля 2012

Я впервые работаю с MVC3 с Razor, и у меня есть частичное представление, которое используется во многих других местах и ​​не имеет модели.А теперь мне это нужно, могу ли я создать опциональную модель?Если он будет принят, то я буду его использовать, в противном случае я оставлю поведение по умолчанию.

[Обновить]

Я бы хотел назвать его так:

@Html.Partial("_myPartialView")

или это:

@Html.Partial("_myPartialView", "Some string")

(модель частичного представления является строкой)

Возможно ли это?

Ответы [ 3 ]

7 голосов
/ 02 апреля 2012
@model FooBar
@if (Model != null)
{
    <div>@Model.SomeProperty</div>
}
else
{
    <div>No model passed</div>
}

UPDATE:

После показа того, как вы называете свою часть, вот что вы можете сделать:

@Html.Partial("_myPartialView", null, new ViewDataDictionary())
@Html.Partial("_myPartialView", "Some string")
1 голос
/ 28 марта 2018

Еще один способ сделать эту работу - не ограничивать тип вашей модели с помощью директивы @model. Затем вы можете использовать свои собственные переменные для различных типов моделей, которые могут быть переданы в частичное представление (либо из явного указания в вызове @Html.Partial, либо просто унаследованного из содержащего представления).

Допустим, пользователи вашего сайта - это либо сотрудники, либо клиенты, и у вас есть небольшое частичное представление для отображения некоторой информации, которая должна работать независимо от того, как они вошли (или даже если нет). Ваши модели выглядят примерно так:

public class Employee
{
    public virtual int ID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public string GetPrimaryRole() { /* Fetch the name of the primary Role from Roles */ }
    // A bunch of other stuff...
}

public class Customer
{
    public virtual int ID { get; set; }
    public virtual string FullName { get; set; }
    public virtual int RewardsPoints { get; set; }
    // A bunch of other stuff...
}

Как видите, информация похожа, но было бы очень трудно абстрагировать эти две вещи в общий интерфейс. В верхней части вашего частичного представления вы можете поместить что-то вроде этого:

@{
    var employee = Model as Employee;
    var customer = Model as Customer;
    string message = "Welcome, Guest!"; //This is displayed if they aren't logged in
    if (employee != null)
    {
        message = string.Format("Welcome, {0} {1}, {2}!",
            employee.FirstName, employee.LastName, employee.GetPrimaryRole());
    }
    else if (customer != null)
    {
        message = string.Format("Welcome, {0}! You have {1} points!",
            customer.FullName, customer.RewardsPoints);
    }
}
<div>@message</div>

Очевидно, что это очень упрощенный пример, но он показывает, как это можно сделать просто и аккуратно. ; -)

0 голосов
/ 02 апреля 2012

Вы можете передать NULL в @Html.Partial("_myPartialView", null)

Затем вы проверяете модель в представлении, как предложил Дарин.

Но лучшим решением, imo, было бы передать объект ViewModel в ваше представление, содержащее нужное вам строковое свойство. Вы делаете его расширяемым и не передаете значение null, вы передаете новый объект ViewModel с пустой или пустой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...