【问题标题】:Razor - Can I make an optional model for a view?Razor - 我可以为视图制作可选模型吗?
【发布时间】:2012-04-02 06:07:47
【问题描述】:

我是第一次使用带有 Razor 的 MVC3,我有一个在许多其他地方使用的局部视图并且没有模型。现在我需要它,我可以创建一个可选模型吗?如果通过了,那么我就使用它,否则我就保留默认行为。

[更新]

我想这样称呼它:

@Html.Partial("_myPartialView")

或者这个:

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

(局部视图模型是一个字符串)

这可能吗?

【问题讨论】:

    标签: .net asp.net-mvc-3 razor


    【解决方案1】:
    @model FooBar
    @if (Model != null)
    {
        <div>@Model.SomeProperty</div>
    }
    else
    {
        <div>No model passed</div>
    }
    

    更新:

    在展示了您调用部分的方式之后,您可以执行以下操作:

    @Html.Partial("_myPartialView", null, new ViewDataDictionary())
    @Html.Partial("_myPartialView", "Some string")
    

    【讨论】:

    • 当没有模型传递时我得到这个错误,即:@Html.Partial("_myPartialView") 传入字典的模型项是'ModelOfTheContainerView'类型,但是这个字典需要一个模型项输入“PartialViewModel”。
    • @kerzek,我已经更新了我的答案,向您展示如何使用 null 模型调用部分而不会出现此异常。您需要使用第三个参数和助手并传递一个新的 ViewDataDictionary 以避免将父模型传递给部分。
    • 谢谢。你是对的,如果我用两个参数调用它,那么取父模型。我想我别无选择,我将使用 string.empty 编辑所有调用。
    • 是的,这就是 Html.Partial 助手的工作方式。如果您没有明确指定不为空的不同模型,则它采用父模型。
    【解决方案2】:

    实现这项工作的另一种方法是不使用 @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>
    

    显然,这是一个非常简单的示例,但它说明了如何简单而干净地完成此操作。 ;-)

    【讨论】:

      【解决方案3】:

      @Html.Partial("_myPartialView", null)可以传入null

      然后按照 Darin 的建议在视图中验证模型。

      但最好的解决方案是 imo,将一个 ViewModel 对象传递给您的视图,其中包含您需要的字符串属性。你让它可扩展并且你不传递一个空值,你传递一个带有空或空字符串的新 ViewModel 对象。

      【讨论】:

      • 我试过了,但是如果我调用第二个参数为null,那么部分取父模型。我需要第三个参数,或者,在这种情况下,一个 string.empty。
      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2014-08-14
      • 2010-10-05
      • 2011-05-06
      • 2011-01-07
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多