Как использовать несколько отдельных моделей в виде бритвы в ASP.NET MVC? - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я работаю над проектом, в котором я хочу отобразить 2 таблицы веб-сетки для каждой модели. Я нашел много уроков по использованию нескольких моделей в обычном MVC View, но он не работает в Razor View. Я как бы застрял на этом сейчас.

То, что я пробовал до сих пор - 1

Контроллер:

Я пытался использовать динамический ExpandObject для добавления двух списков в это представление, посмотрите код:

public ActionResult Index(int page = 1, string sortApi = "ApiName",string sortCompany = "CompanyName", string sortdir = "asc", string search = "")
{
        int pageSize = 13;
        int totalRecords = 0;
        if (page < 1)
        {
            page = 1;
        }
        int skip = (page * pageSize) - pageSize;
        ViewBag.TotalRows = totalRecords;
        ViewBag.search = search;

        //Dynamic ExpandObject
        var dataApiRedirects = getRedirects(search, sortApi, sortdir, skip, pageSize, out totalRecords);
        var dataCompanies = getCompanies(search, sortCompany, sortdir, skip, pageSize, out totalRecords);
        dynamic mymodel = new ExpandoObject();
        mymodel.ApiList = dataApiRedirects;
        mymodel.CompanyList = dataCompanies;

        return View(mymodel);
}

Вид:

<div class="col-sm-1 d-flex align-items-stretch" style="padding-top: 5%;">
                <div class="form-group">
                    <a href="#" class="btn btn-primary" data-toggle="modal" data-target="#myModal">+API</a>
                </div>
                <!--MODAL-->
                <div class="modal fade" id="myModal" >
                    <div class="modal-dialog" style="width: 20%;">
                        <div class="modal-content">
                            <div class="modal-header">
                                <a href="#" class="close" data-dismiss="modal">&times;</a>
                                <h3 class="modal-title">Add API</h3>
                            </div>
                            <div class="modal-body">
                                <form id="myForm">
                                    <p>@Html.TextBoxFor(Model.ApiList.ApiName, new { @class = "form-control", @placeholder = "Name" })</p>
                                    <p>@Html.TextBoxFor(model => model.ApiList.First().Company.CompanyName, new { @class = "form-control", @placeholder = "Company" })</p>
                                    <p>@Html.TextBoxFor(model => model.ApiList.First().ApiURL2, new { @class = "form-control", @placeholder = "URL" })</p>
                                </form>
                            </div>
                            <div class="modal-footer">
                                <a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a>
                                <input type="reset" value="Submit" class="btn btn-success" id="btnSubmit" />
                            </div>
                        </div>
                    </div>
                </div>
 </div>

Однако, когда я хочу создать текстовые поля в моем модале, я получаю следующую ошибку:

enter image description here

То, что я пробовал до сих пор - 2

Я также пытался использовать ViewBag:

Код контроллера:

public ActionResult Index(int page = 1, string sortApi = "ApiName",string sortCompany = "CompanyName", string sortdir = "asc", string search = "")
{
        int pageSize = 13;
        int totalRecords = 0;
        if (page < 1)
        {
            page = 1;
        }
        int skip = (page * pageSize) - pageSize;

        var dataApiRedirects = getRedirects(search, sortApi, sortdir, skip, pageSize, out totalRecords);
        var dataCompanies = getCompanies(search, sortCompany, sortdir, skip, pageSize, out totalRecords);
        dynamic mymodel = new ExpandoObject();
        mymodel.ApiList = dataApiRedirects;
        mymodel.CompanyList = dataCompanies;

        //Model 1 data
        ViewBag.CompaniesList = dataCompanies;


        ViewBag.TotalRows = totalRecords;
        ViewBag.search = search;

        //Model 2 data
        return View(mymodel);
}

HTML код:

var getlist = ViewBag.CompaniesList as IEnumerable<APIBrokerFrontend.Models.Company>;

<div class="modal fade" id="myModalCompany">
                <div class="modal-dialog" style="width: 20%;">
                    <div class="modal-content">
                        <div class="modal-header">
                            <a href="#" class="close" data-dismiss="modal">&times;</a>
                            <h3 class="modal-title">Add Company</h3>
                        </div>
                        <div class="modal-body">
                            <form id="myForm">
                                @<p>@Html.TextBoxFor(getlist.First().CompanyName, new { @class = "form-control", @placeholder = "Company Name" })</p>
                            </form>
                        </div>
                        <div class="modal-footer">
                            <a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a>
                            <input type="reset" value="Submit" class="btn btn-success" id="btnSubmit" />
                        </div>
                    </div>
                </div>
</div>

При использовании ViewBag я получаю следующую ошибку:

enter image description here

У кого-нибудь есть решение для этого?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Вы не можете использовать две модели для передачи в представлении. Но вы можете посмотреть на ViewData. Это Dictionary<string, object>. Вы можете попробовать ViewData["Model2"] = Model2; в вашем контроллере, и в представлении вам нужно привести его следующим образом Model2 model2 = (Model2)ViewData["Model2"].

Редактировать: ошибочно использовать ViewBag вместо ViewData.

0 голосов
/ 14 мая 2019

Проблема в том, что используется операция типа First(). Правильный способ использования динамической модели объясняется здесь . Исправьте код, чтобы использовать индекс 0 (например, ApiList[0]), чтобы получить первый элемент вместо First().

Пример использования динамического:

Вид:

@using Sample;

@model dynamic

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<a href="~/Default1">@Model.Blogs[0].MyCompany.CompanyName</a>

Контроллер:

public class Company
{
    public string CompanyName { get; set; }
}

public class Blog
{
    public string Name;
    public string URL;
    public Company MyCompany;
}

public class MyModel
{
    public List<Blog> Blogs { get; set; }
}

public class Default1Controller : Controller
{
 public class Company
{
    public string CompanyName { get; set; }
}

public class Blog
{
    public string Name;
    public string URL;
    public Company MyCompany;
}

public class MyModel
{
    public List<Blog> Blogs { get; set; }
}

public class Default1Controller : Controller
{
    List<Blog> topBlogs = new List<Blog>
      { 
          new Blog { Name = "ScottGu", URL = "http://weblogs.asp.net/scottgu/", MyCompany = new Company{
              CompanyName = "Microsoft"
          }},
          new Blog { Name = "Scott Hanselman", URL = "http://www.hanselman.com/blog/", MyCompany = new Company{
              CompanyName = "Microsoft"
          }},
          new Blog { Name = "Jon Galloway", URL = "http://www.asp.net/mvc", MyCompany = new Company{
              CompanyName = "Microsoft"
          }}
      };

    //
    // GET: /Default1/

    public ActionResult Index()
    {
        var myModel = new MyModel();
        myModel.Blogs = topBlogs;

        return View(myModel);
    }

}

Надеюсь, это поможет.

0 голосов
/ 14 мая 2019

Вы не можете.

Вы должны определить тип модели представления, которую вы передаете, и определить ее использование.

Например:

@model ViewModel.MyModel

Razor представляет конкретный синтаксис, вы не можете использовать его как динамический javascript, вы должны иметь его предварительно определенным, иначе компилятор razor не знает тип используемого вами и не знает, существует ли такое свойство.

ОБНОВЛЕНИЕ

Во второй мысли есть способ обойти это, используйте Viewbag, он динамичен и предназначен для него.Тем не менее, перед использованием убедитесь, что в нем есть свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...