【问题标题】:How to use two models in a single view?如何在一个视图中使用两个模型?
【发布时间】:2020-08-06 21:25:19
【问题描述】:

我试图在一个视图中使用在两个不同模型中创建的变量。我正在使用 View Model 方法来做到这一点。但是在我看来,模型中的变量无法识别,并抛出错误;

“‘CategoryItemViewModel’不包含‘result’的定义,并且找不到接受‘CategoryItemViewModel’类型的第一个参数的可访问扩展方法‘result’(您是否缺少 using 指令或程序集引用?“

您可以在下面看到两个原始模型的代码;

类别模型:

public class Category
{
   public string result { get; set; }
   public char[] delimiterChar { get; set; }
   public Array userData { get; set; }
}

物品型号:

public class Item
{                      
   public Array userDataItems { get; set; }
}

第三,我创建了一个视图模型,目的是将上述两个模型链接为一个,

视图模型:

public class CategoryItemViewModel
{
   public Item ItemList { get; set; }
   public Category CategoryList { get; set; }
}

最后我有一个控制器负责组合必要的模型以及初始化它们并将它们返回到视图模型,以便它们可以在视图中使用:

public ActionResult GetCategoryItem()
{
   CategoryItemViewModel CIVM = new CategoryItemViewModel();
   CIVM.ItemList = GetItemModel();
   CIVM.CategoryList = GetCategoryModel();
   return View(CIVM);             
}

public Category GetCategoryModel()
{
   var dataFile = Server.MapPath("~/App_Data/Category.txt");
   Category cModel = new Category()
   {
     result = "",
     delimiterChar = new[] { ',' },
     userData = System.IO.File.ReadAllLines(dataFile) //Category Text File
   };

   return cModel;
}

public Item GetItemModel()
{
   var dataFileItems = Server.MapPath("~/App_Data/Category.txt");
   Item iModel = new Item()
   {
      userDataItems = System.IO.File.ReadAllLines(dataFileItems) //Items Text File
   };

   return iModel;
}

请注意,我正在为我的控制器和视图使用如下命名空间:

控制器命名空间:

using System.Web.Mvc;
using u18043039_HW3.ViewModel;
using u18043039_HW3.Models;

查看命名空间:

@using u18043039_HW3.Models
@using u18043039_HW3.Controllers
@model u18043039_HW3.ViewModel.CategoryItemViewModel

最后,我的看法:

 @Model.result
        @if (Model.result == "")
        {
            int count = 0;

            foreach (String dataLine in Model.userData)
            {

                string countString = count.ToString();
                string target = "dataLine" + countString;
                string trigger = "#" + target;

                <p>
                    <a data-toggle="collapse" href="@trigger" role="button" aria-expanded="false" aria-controls="collapseExample">
                        @dataLine.Split(Model.delimiterChar)[0]
                    </a>

                    <button class="btn" onclick="location.href='@Url.Action("Items", "Items")'" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="fas fa-plus secondaryPlusIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                    <button class="btn" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="far fa-edit secondaryEditIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                    <button class="btn" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="far fa-trash-alt secondaryDeleteIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                </p>



                <div class="collapse" id="@target">
                    <div class="card card-body w-25 p-3 collapsible" id="@dataLine.Split(Model.delimiterChar)[1]">
                        <!-- Card Elements here -->
                    </div>
                </div>

                count++;
            }
        }

【问题讨论】:

  • 你能展示你的实现吗?
  • 我认为的实施?如果是这样,我已经更新了这个问题。希望这会有所帮助!
  • 视图中的变量,例如“result”、“userData”、“delimiterChar”等会引发问题中提到的错误。

标签: c# asp.net asp.net-mvc string model-view-controller


【解决方案1】:

在你的View中,Model代表CategoryItemViewModel,为了去result,你需要先访问CategoryList。

所以你应该这样做@Model.CategoryList.result

【讨论】:

  • 知道了,LinkedListT 提到了同样的事情,但是你是第一个哈哈。谢谢你们俩。现在一切正常。
【解决方案2】:

您错误地定义了您的@Model。模型代表CategoryItemViewModel,它没有结果属性。您必须将@Model 更新为@Model.CategoryList.result

个人喜好,我只会使用@Model 注入模型,然后在需要的地方指定属性。 IE。

@Model

Html.TextBoxFor(x => x.CategoryList.result)

【讨论】:

  • 谢谢您,我一定会考虑您的建议。感谢队友的帮助和所花费的时间。
【解决方案3】:

您的模型必须是CategoryItemViewModel 类型

@model CategoryItemViewModel

然后您需要通过视图模型中的CategoryList 变量访问result 属性,例如:

@Model.CategoryList.result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多