【问题标题】:DropDownListFor and relating my lambda to my ViewModelDropDownListFor 并将我的 lambda 与我的 ViewModel 相关联
【发布时间】:2023-03-15 09:28:01
【问题描述】:

谷歌搜索了一段时间后,我仍然在这里画一个空白。我正在尝试使用 ViewModel 来拉取字典并将其提供给强类型视图中的下拉列表:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="EveNotebook.ViewModels.CorporationJoinViewModel" %>

...

<%: Html.DropDownListFor(c => c.CorpDictionary.Keys, new SelectList(Model.CorpDictionary, "Value", "Key"))%>

我收到了错误:

CS1061:“object”不包含“CorpDictionary”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“CorpDictionary”

以及我的 ViewModel 的相关部分

   public class CorporationJoinViewModel
    {
        DB _eveNotebook = new eveNotebookDB(); // data context

        public Dictionary<int, string> CorpDictionary
        {
            get
            {
                Dictionary<int, string> corporations = new Dictionary<int, string>();

                int x = 0;
                foreach (Corporation corp in _db.Corporations)
                {
                    corporations.Add(x, corp.name);
                }

                return corporations;
            }
        }

我承认我对 linq 如何从该 lambda 中找到我的 ViewModel 对象有一个非常神奇的理解,而错误消息让我认为它不是。我的问题是我用来传递数据的方法吗?我在这里错过了什么?


解决方案

(与优秀的答案非常相似,但通过编译器并修复了过程中的一些错别字):

控制器

  var model = new CorporationJoinViewModel
                {
                    Corps = _eveNotebook.Corporations.Select( c => new SelectListItem
                                     {
                                          Text = c.name,
                                          Value = c.id.ToString()
                                     })
                };
    
    return View(model);

查看

Inherits="System.Web.Mvc.ViewPage<IEnumerable<EveNotebookLibrary.Models.Corporation>>" %>

...

<%: Html.DropDownListFor(c => c.Corps, new SelectList(Model.Corps))%>

视图模型

public class CorporationJoinViewModel : ViewPage
{
    public int CorporationId { get; set; }

    public IEnumerable<SelectListItem> Corps { get; set; }
}

【问题讨论】:

    标签: asp.net .net asp.net-mvc data-binding


    【解决方案1】:

    首先,您没有使用链接,您只是使用 lambda 表达式来指定模型上的属性。其次,您的视图需要从 ViewPage 继承,在这种情况下,是特定于您的模型的强类型视图页面。第三,我建议你有一个 CorporationId 的属性(从选择的值回发)和一个IEnumerable&lt;SelectListItem&gt; 来为下拉列表提供值,而不是使用魔术字符串来构造一个 SelectList。这可以使用 LINQ 或扩展方法来进行选择。

    通常,我不会让视图模型成为容器以外的任何东西——它应该与数据库无关。从数据库中填充控制器中的视图模型。

    <%@ Page Title="" Language="C#"
        MasterPageFile="~/Views/Shared/Site.Master"
        Inherits="System.Web.Mvc.ViewPage<EveNotebook.ViewModels.CorporationJoinViewModel>"
     %>
    
    <%: Html.DropDownListFor(c => c.CorporationId, Model.CorpDictionary )%>
    

    型号代码

    public class CorporationJoinViewModel
    {
        public int CorporationId { get; set; }
    
        public IEnumerable<SelectListItem> CorpDictionary { get; set; }
    }
    

    控制器代码

    ...
    var model = new CorporationJoinViewModel
                {
                    CorpDictionary = _eveNotebook.Corporations.Select( c => new SelectListItem
                                     {
                                          Text = c.name,
                                          value = c.id.ToString()
                                     }
                };
    

    【讨论】:

    • 非常感谢。我基本上只是想尽一切办法让这个 DropDown 工作,但你的回答超出了这个范围,让我重新思考我使用 ViewModels 的方式。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多