none
Ошибка при отображении частичного представления RRS feed

  • Вопрос

  • Добрый вечер, при выполнении появилась ошибка:

    "Элемент модели, переданный в словарь, имеет тип "System.Collections.Generic.List`1[FitnesControl.Models.Users]", но для этого словаря требуется элемент модели типа "FitnesControl.Models.App_Setting"."

    Вот так выглядит код _layout.cshtml

    <!DOCTYPE html>
    <html>
    <head>
        <title>@ViewBag.Title</title>
        <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
        <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    </head>
    <body>
        <div class="page">
            <div id="header">
                <div id="title">
                    @Html.Partial("_AppNamePartial") //ВОТ ТУТ ОШИБКА!!!
                </div>
                <div id="logindisplay">
                    @Html.Partial("_LogOnPartial")
                </div>
                <div id="menucontainer">
                    <ul id="menu">
                        <li>@Html.ActionLink("Главная", "Index", "Home")</li>
                        <li>@Html.ActionLink("Финансы", "Index", "Home")</li>
                        <li>@Html.ActionLink("Статистика", "Index", "Home")</li>
                        <li>
                            @Html.ActionLink("Настройки", "Index", "Setting")
                            <ul>
                                <li>@Html.ActionLink("Настройки", "Index", "Setting")</li>
                                <li>@Html.ActionLink("Настройки пользователей", "Index", "UserSetting")</li>
                            </ul>
                        </li>   
                    </ul>
                </div>
            </div>
            <div id="main">
                @RenderBody()
            </div>
            <div id="footer">
            </div>
        </div>
    </body>
    </html>
    

    собственно само частичное представление:  _AppNamePartial.cshtml

    @model FitnesControl.Models.App_Setting
    
    <div class="blocks">
        <img src="@FitnesControl.Models.App_LogoName.LogoLink()"  alt =""/>
    </div>
    <div >
        <h1> @FitnesControl.Models.App_LogoName.Name()</h1>
    </div> 

    код класса:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using FitnesControl.DAL;
    
    namespace FitnesControl.Models
    {
        /// <summary>
        /// Класс необходим для заполенения частичного представления для Мастер страницы
        /// из БД забирается ссылка на логотип и название приложения
        /// </summary>
        public class App_LogoName
        {
    
            private IAppSettings _repository;
    
            public App_LogoName()
                : this(new AppSettingRegository())
            { }
    
            public App_LogoName(IAppSettings repository)
            {
                _repository = repository;
            }
    
            public static  string Name()
            {
                App_LogoName ALN = new App_LogoName();
                return ALN._repository.GetSetting(1).App_Name;
            }
    
            public static string LogoLink()
            {
                App_LogoName ALN = new App_LogoName();
                return ALN._repository.GetSetting(1).App_Logo;
            }
        }
    }

    Скажите что я делаю не так? В общем задача выглядит так: выводить название приложение и логотип (которые хранятся на БД) на каждой странице.

    Надеюсь на вашу помощь.

    13 декабря 2012 г. 17:34

Ответы

  • Я что то не вижу данных по передаче FitnesControl.Models.App_Setting в модель, только это

    public ViewResult Index()
    {
      var user = db.User.Include(u => u.Roles);
      return View(user.ToList());
    }       

    Вам нужно ещё и объект FitnesControl.Models.App_Setting в модель передать, например в качестве DTO.

    • Изменено YatajgaEditor 14 декабря 2012 г. 5:42
    • Предложено в качестве ответа Abolmasov DmitryModerator 17 декабря 2012 г. 8:21
    • Помечено в качестве ответа mr_arti 18 декабря 2012 г. 15:22
    14 декабря 2012 г. 5:41
    Модератор
  • Не знаю насколько правильно я сделал, но работает.

    в коде _layout.cshtml

    @{
                        FitnesControl.Models.App_Setting appSetting = new FitnesControl.Models.App_Setting();
                        <div class="blocks">
                            <img src="@FitnesControl.Models.App_LogoName.LogoLink()"  alt =""/>
                        </div>
                        <div >
                            <h1> @FitnesControl.Models.App_LogoName.Name()</h1>
                        </div> 
                    }

    • Помечено в качестве ответа mr_arti 18 декабря 2012 г. 15:22
    18 декабря 2012 г. 15:22

Все ответы

  • Покажите код контроллера, куда Вы передаёте объект модели. У Вас передаётся один тип, а ожидается другой, поэтому и ошибка.
    13 декабря 2012 г. 19:19
    Модератор
  • Вот код контроллера :

    using System;
    ...
    using FitnesControl.Models;
    using FitnesControl.DAL;
    
    namespace FitnesControl.Controllers
    { 
        public class UserSettingController : Controller
        {
            private GlobalContext db = new GlobalContext();
    
            private IUserSetting _repositoryUserSetting;
            public UserSettingController()
                : this(new UserSettingRepository())
            { }
    
            public UserSettingController(IUserSetting repositoryUserSetting)
            {
                _repositoryUserSetting = repositoryUserSetting;
            }
    
            //
            // GET: /UserSetting/
    
            public ViewResult Index()
            {
                var user = db.User.Include(u => u.Roles);
                return View(user.ToList());
            }
    
            //
            // GET: /UserSetting/Details/5
    
            public ViewResult Details(int id)
            {
                return View(_repositoryUserSetting.GetUser(id));
            }
    
            //
            // GET: /UserSetting/Create
    
            public ActionResult Create()
            {
                ViewBag.RoleID = new SelectList(db.Role, "RoleID", "RoleName");
                return View();
            } 
    
            //
            // POST: /UserSetting/Create
    
            [HttpPost]
            public ActionResult Create(Users users,HttpPostedFileBase fileUpload)
            {
                if (!ModelState.IsValid)
                    return View();
                try
                {
                    ImageProcessing imageProc = new ImageProcessing();
    
                    Image src = null;
                    if (!(fileUpload == null))
                    {
                        src = Image.FromStream(fileUpload.InputStream, true, true);
                    }
                    else
                    {
                        if(users.RoleID==1)
                            src = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Images/admin.png");
                        if (users.RoleID == 2)
                            src = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Images/manager.png");
                    }
                    src = imageProc.ScaleImage(src, 150);
    
                    _repositoryUserSetting.Register(users, src);
                    return RedirectToAction("Index");
                }
                catch
                {
                    ViewBag.RoleID = new SelectList(db.Role, "RoleID", "RoleName", users.RoleID);
                    return View(users);
                }
            }
            
            //
            // GET: /UserSetting/Edit/5
     
            public ActionResult Edit(int id)
            {
                ViewBag.RoleID = new SelectList(db.Role, "RoleID", "RoleName", _repositoryUserSetting.GetUser(id).RoleID);
                return View(_repositoryUserSetting.GetUser(id));
            }
    
            //
            // POST: /UserSetting/Edit/5
    
            [HttpPost]
            public ActionResult Edit(Users users)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(users).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewBag.RoleID = new SelectList(db.Role, "RoleID", "RoleName", users.RoleID);
                return View(users);
                
            }
    
            //
            // GET: /UserSetting/Delete/5
     
            public ActionResult Delete(int id)
            {
                return View(_repositoryUserSetting.GetUser(id));
            }
    
            //
            // POST: /UserSetting/Delete/5
    
            [HttpPost, ActionName("Delete")]
            public ActionResult DeleteConfirmed(int id)
            {            
                Users users = db.User.Find(id);
                db.User.Remove(users);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }
    }

    13 декабря 2012 г. 21:15
  • Я что то не вижу данных по передаче FitnesControl.Models.App_Setting в модель, только это

    public ViewResult Index()
    {
      var user = db.User.Include(u => u.Roles);
      return View(user.ToList());
    }       

    Вам нужно ещё и объект FitnesControl.Models.App_Setting в модель передать, например в качестве DTO.

    • Изменено YatajgaEditor 14 декабря 2012 г. 5:42
    • Предложено в качестве ответа Abolmasov DmitryModerator 17 декабря 2012 г. 8:21
    • Помечено в качестве ответа mr_arti 18 декабря 2012 г. 15:22
    14 декабря 2012 г. 5:41
    Модератор
  • Привет. Пожалуйста, не бросайте топик без ответа или комментариев. Если чье-либо сообщение решает проблему, то отметьте его как ответ. Спасибо.


    Для связи [mail]

    17 декабря 2012 г. 8:21
    Модератор
  • Не знаю насколько правильно я сделал, но работает.

    в коде _layout.cshtml

    @{
                        FitnesControl.Models.App_Setting appSetting = new FitnesControl.Models.App_Setting();
                        <div class="blocks">
                            <img src="@FitnesControl.Models.App_LogoName.LogoLink()"  alt =""/>
                        </div>
                        <div >
                            <h1> @FitnesControl.Models.App_LogoName.Name()</h1>
                        </div> 
                    }

    • Помечено в качестве ответа mr_arti 18 декабря 2012 г. 15:22
    18 декабря 2012 г. 15:22