ASP.NET MVC- 컨트롤러에서 C#을 사용하여 뷰로 다른 어셈블리를 참조하는 모델 전달

StackOverflow https://stackoverflow.com/questions/1415931

  •  06-07-2019
  •  | 
  •  

문제

두 개의 어셈블리가 주어진다 :

project.web
project.lib

Project.Web Assembly References Project.lib는 일부 비즈니스 로직이 포함되어 있습니다. project.lib의 간단한 클래스 :

public class Person
{
    public string Name;
}

project.web.controllers :

Using project.lib.models;

public class PersonController : Controller
{
    Person person = new Person();

    public ActionResult Index()
    {
        return View(person);
    }
}

이것은 내가 몇 가지 질문이있는 부분입니다. 많은 샘플 프로젝트에서 나는보기에서 다음을 보았습니다 (이 경우 index.aspx) :

<% @Import Namespace="project.lib.models" %>

다음과 같은 모델 객체를 사용할 수 있습니다.

<%= Model.Name %>

나는 그 예처럼 작동하기 위해 그것을 얻지 못했습니다.

<%= (Model as Person).Name %>

또는

<%
    var person = (Person)Model;
    Response.Write(person.Name);
%>

왜 이렇게합니까? 이에 대한 이유는 무엇입니까? 코멘트? 제안? 내 수업 정의는 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace project.lib.models
{
    public class Person
    {
        public Int64 PersonID;
        public string DisplayName;
        public string RealName;
    }
}
도움이 되었습니까?

해결책

당신의 견해는 강력하게 입력되지 않을 수 있습니다. 다음을 시도하십시오.

  1. 보기 마크 업을 복사하십시오
  2. 보기를 삭제하십시오
  3. 보기를 유도하는 컨트롤러 동작으로 이동하십시오
  4. 이 방법을 마우스 오른쪽 버튼으로 클릭하고보기 추가 옵션을 선택하십시오.
  5. 이것이 강력하게 입력 된 뷰이며 의도 한 모델의 유형을 올바르게 식별해야합니다.
  6. 보기 마크 업을 새로 만든 시야에 붙여 넣으십시오.

이것은 작동해야합니다. 모델을 올바르게 캐스팅 할 수 있기 때문에 어셈블리가없는 것처럼 보이지 않습니다.

보기 삭제/복원의 고통없이 위의 일을 수행 할 수 있습니다. 각보기에는 다음과 유사한 첫 번째 줄로 선언이 있습니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DomainModel.Person>" %>

이해해야 할 중요한 섹션은 상속 속성입니다.이 뷰는 MVC를 확장한다는 것을 의미합니다. ViewPage<DomainModel.Person> 수업. 모델 속성은 런타임에 유형의 도메인 모델입니다.

또한 이전 버전의 ASP.NET MVC에는 강력한 뷰가 올바르게 작동하는 것을 효과적으로 방지하는 문제가 있습니다. 보다 강력하게 입력 된보기를 위해 ASP.NET MVC RC1에서 ADD보기 대화 상자를 사용하는 문제 자세한 내용은.

편집하다: 여기에 게시 한 모든 사람이 약간의 형사 작업을 한 후에도 Visual Studio가 사람 수업이 포함 된 구식 버전의 어셈블리를 참조하는 것처럼 보입니다. 개발 환경을 폐쇄하고 모든 OBJ/BIN 폴더를 정리하고 다시 시작하면이 문제가 해결 된 것으로 보입니다.

다른 팁

< %@ page %> 지침을 게시 해 주시겠습니까? 그것은 다음과 같아야합니다.

<%@ Page Language="C#"
         [...]
         Inherits="System.Web.Mvc.ViewPage<project.lib.models.Person>" %>

대신이 뷰를 위해 강력하게 입력 한 코드-비만 파일을 만들어 보셨습니까?

Code-Behind 파일이 되려면 View의 상속 속성을 업데이트해야합니다.

<%@ Page Language="C#" 
    CodeBehind="Index.aspx.cs" Inherits="project.web.Views.People.Index" %>

그리고 Code-Behind에서 :

namespace project.web.Views.People.Index {
  public partial class Index : System.Web.Mvc.ViewPage<project.lib.models.Person>
  {}
}

시스템을 해결하는 데 문제가 없다고 생각합니다 .Web.mvc.viewPage 클래스는 페이지가로드되지 않습니다 (System.Web.MVC.ViewPage를 찾을 수없는 줄을 따라 예외가 발생합니다), 그리고 당신은 모델 속성에 액세스 할 수 없을 것입니다.

Update 1: 로드/유형에 대한 문제가 아니라고 확신 할 수 있습니다. System.Web.MVC.ViewPage 또는 project.lib.models.person. 질문에서 언급했듯이, 그것은 당신이 사용할 때 작동합니다.

<% @Import Namespace="project.lib.models" %>
...
<%= (Model as Person).Name %>

사용 System.Web.Mvc.ViewPage<project.lib.models.Person> 페이지 지침에 <%= Model.Name %> 작동해야합니다. 그것이 작동하지 않으면 시도 할 몇 가지 추가 사항 :

  • 그렇게 할 때 가져 오기 지침을 제거하십시오.
  • Web.Config에 네임 스페이스가 추가되어 있는지 확인하십시오.

위의 2 가지 중 어느 것도 문제를 일으키지 않지만, 이전에 언급 된 내용으로 작업하지 않으면 매우 이상한 시나리오가 될 것입니다. 또한 Web.Config에서 일반적으로 사용되는 네임 스페이스를 추가 한 경우 사용할 수 있습니다. ViewPage<Person> 페이지 지침에.


그만큼 모델명 당신은 네임 스페이스를 가져 오는 것과 관련이 없을 필요가 없으며, 페이지 지시문에서 설정 한 유형에서 얻을 수 있습니다.

ViewPage 클래스에는 속성 T 모델이 있으므로 이름 속성에 액세스 할 수 있습니다 (지정된 유형으로 작업하고 있음).

그렇게하려면 귀하의 경우 귀하의 경우 귀하의 경우 귀하의 경우 개인 클래스에 모델 객체에 강력하게 입력해야합니다.

작업을 수행 해야하는 모든 것은 project.lib에 굴절을 추가하고 페이지 업데이트를 추가하는 것입니다.

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top