【问题标题】:how to change @model directive to a different model in razor view?如何在剃刀视图中将@model 指令更改为不同的模型?
【发布时间】:2012-07-16 08:24:59
【问题描述】:

我有一个控制器,它创建一个模型并调用一个将模型作为参数传递的视图。 在视图中有一个@model 指令指定模型的类型。 我想重用相同的视图,但从控制器传递不同的模型。 是否可以在视图中动态(或有条件地)更改@model 指令?

例如,在我的控制器操作中:

var contactsModel = db.GetContacts();
var companiesModel = db.GetCompanies();
return (someCondition)? View(contactsModel):View(companiesModel);

那么如何在 View 指令中定义 @model 来满足两个模型呢? 我希望相同的视图根据传递的模型类型来呈现信息。

谢谢。


更新:

谢谢,但我只需要对不同模型使用一个通用视图。

这是可能的,这是可以做到的。

在我定义的视图中:

@model IEnumerable<MvcApplication1.Models.IBaseInterface>

在我定义的模型类中:

public interface IBaseInterface { }

public class Contact: IBaseInterface {}

public class Company: IBaseInterface {}

然后,在我使用的视图中:

@if (Model is List<Contact>) {
    @foreach (var item in (List<Contact>)Model)
        { // Here item has type Contact }
}

@if (Model is List<Company>) {
    @foreach (var item in (List<Company>)Model)
        { // Here item has type Company }
}

完美运行:)

【问题讨论】:

标签: c# asp.net-mvc-3 razor model


【解决方案1】:

是否可以动态(或有条件地)更改@model 视图中的指令?

没有。

如果您需要传递不同的模型,这意味着您需要不同的视图:

return (someCondition) 
    ? View("Contacts", contactsModel) 
    : View("Companies", companiesModel);\

ASP.NET MVC 中的基本规则如下:a view model per view

【讨论】:

    【解决方案2】:

    简单而好的解决方案是使用视图模型并将视图绑定到该视图模型,然后从控制器操作中,您可以将模型转换为视图模型并将其传递给视图。

    如果您是动力学爱好者并且两个模型的属性相同,另一个选项是您可以将视图绑定到 dynamic 模型。

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多