【问题标题】:Access a custom model from the view从视图访问自定义模型
【发布时间】:2013-09-20 18:59:46
【问题描述】:

我正在使用 asp.net MVC 4 和 razor 语法。我有一个自定义模型,想象一下:

namespace MyProject.SampleModel
{
    public class MyCustomModel
    {
        public bool MyBoolean1 { get; set; }
        public bool MyBoolean2 { get; set; }
    }
}

所以从视图上看,在标题中,我这样做了:

@model MyProject.SampleModel.MyCustomModel

(...)
@Html.CheckBoxFor(m => m.MyBoolean1 ) <---- ERROR HERE: MyBoolean1 is not recognized
(...)

但是在 CheckBoxFor 行中,在 lambda 中,我的 MyBoolean1 无法识别。为什么?

第一次尝试:

好像换了

@model MyProject.SampleModel.MyCustomModel 

与:

@using MyProject.SampleModel 

没有编译错误,但在运行时出现错误:

Compiler Error Message: CS1963: An expression tree may not contain a dynamic operation

【问题讨论】:

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


    【解决方案1】:

    替换

    @using MyProject.SampleModel 
    

    与

    @model MyProject.SampleModel.MyCustomModel
    

    由于错误状态,lambda 表达式不支持动态模型。通过定义模型,您将对其进行强类型化。

    使用你的错误语句,你只是引用了一个命名空间,如果你从代码中删除你的 lambda 表达式,它本身就可以工作,但你将不再有一个强类型视图。

    亲切的问候

    //编辑:

    我们发现,问题的核心是:如何在一个视图中使用 2(3, 4, 5 ... n) 个模型。

    假设您有模型 1:

    public class MyCustomModel
    {
        public bool MyBoolean1 { get; set; }
        public bool MyBoolean2 { get; set; }
    }
    

    和模型 2:

    public class SecondModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    您需要创建一个结合这两个模型的第三个类。

    public class ExampleViewModel
    {
        public MyCustomModel BoolValues { get; set; }
        public SecondModel Names { get; set; }
    }
    

    现在您只需在控制器操作中将 ExampleViewModel 返回到您的视图并使用

    @model MyProject.SampleModel.ExampleViewModel
    

    并以这种方式访问​​您的属性:

    @foreach (var item in Model.BoolValues)
    {
        <div>@item.Myboolean1</div>
    }
    
    @foreach (var item in Model.Names)
    {
        <div>@item.FistName</div>
    }
    

    【讨论】:

    • 在运行时,执行您所说的会引发以下错误:编译器错误消息:CS0118: 'MyProject.SampleModel' is a 'namespace' but is used like a 'type'
    • 我没有意识到您引用的是命名空间而不是类,只是看到了 using 与 model 错误。我编辑了我的答案以便更好地理解。
    • 如果我删除命名空间行并将视图作为@model MyCustomModel 导入然后工作。这里的问题是,假设我有另一个自定义模型,我也想导入:问题是你不能导入多个模型......现在我遇到了这个问题。
    • 是的,你可以。您需要的是ViewModel 只需用谷歌搜索或使用此处关于 SO 的问题之一作为参考stackoverflow.com/questions/16548376/…。我将编辑我的答案,以便快速提醒您
    • 不要在一个视图中单独使用 2 个模型。像我解释的那样构建 ViewModel 并使用 ViewModel。
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多