현재 인터넷을 통해 제공되는 내부 회사 용 MVC 앱이 있지만 (클라이언트 액세스를 제공하는 지식을 바탕으로 설계되었습니다) (ssl). 우리는 이제 고객과 고객의 계정에 대한 액세스를 제공하고자합니다. 프로파일 편집, 프로그램 등록, 현재 서비스의 상태, 꽤 전형적인 것들. 그러나 나는 그것을 보러가는 방법을 보았다. 회사 직원에게는 적용되지 않는 공개 액세스에 고유 한 사항이있을 수 있지만 가능한 한 DRY 상태로 유지하면서 기존 코드를 유선형으로 유지하려고합니다. 저는 두 가지 옵션을 생각해 봤습니다. 나는 누락 된 의견과 통찰력을 찾고 있습니다. 나는이 디자인을 위조하거나 다른 옵션을 놓치고 있습니까?MVC4 - 내부 비즈니스 앱에 대한 클라이언트 포털을 만들기위한 DisplayMode와 영역
MVC4의 DisplayModes
MVC4 맞춤 기준을 기반으로 다른 뷰를 제공하기 위해 (DisplayModes를 통해) 기능을 제공합니다. 기본 구현은 AgentString을 기반으로하며 모바일 장치 (태블릿, 전화)에 대한 대체보기를 제공하는 데 사용됩니다. 그러나 나는 그것을 테스트했고 사용자 정보 (특정 역할을하는 것)와 같은 다른 기준을 기반으로 대체보기를 제공하는 데 사용할 수도 있습니다. 나는 커스텀 화가 중요하다면 대체 뷰를 얻는 공개 클라이언트 계정에 고유 한 역할을 시스템에 추가 할 수 있다고 생각하고있다. 그렇지 않은 경우 커스터마이징이 수행 된 경우 기본 뷰를 사용하도록 되돌아 가게한다. 새로운 관점을 필요로하지 않습니다. 나머지 액세스는 기존 사용 권한, 역할 및 보안 제한을 사용하여 가능한 한 많이 처리됩니다. 관리자 인터페이스는 직원 및 공용 클라이언트 모두에서 동일하게 작동하므로 사용자가 직원인지 또는 공용 클라이언트인지에 따라 서로 다른 코드 경로를 사용하여 다소 흐릿해질 수 있습니다. 실수로 직원들에게만 의미가있는 것을 노출시킬 가능성은 말할 것도 없습니다. 그러나 그것은 또한보기를 매우 건조하게 유지할 것입니다.
Global.asax에
var displayModes = DisplayModeProvider.Instance.Modes;
displayModes.Insert(0, new DefaultDisplayMode("Client")
{
ContextCondition = (context => context.User.Identity.IsAuthenticated && context.User.IsInRole("Client"))
});
MVC 지역
MVC는 애플리케이션의 부품을 분리 내에서 일종의을 제공하는 방법으로 영역을 사용할 수있는 기능을 제공합니다 같은 사이트. 그래서 예를 들어 웹 사이트/응용 프로그램에 대한 클라이언트 포털 역할을하는 Portal이라는 영역을 만들 수 있습니다. 이 방법을 사용하면 사이트의 기본 부분에 사용되는 컨트롤러를 상속 할 수 있어야하며 클라이언트 포털에 대해 다른 로직이 필요할 때 필요한 특정 작업을 무시하고 나머지는 기본 클래스로 넘어 가게해야합니다 (I haven ' 이 이론을 아직 테스트하지는 않았지만 그것이 효과가있을 것이라고 가정하고 있습니까?). 나는 이것이 DRY 컨트롤러를 초래할 것이라고 생각하지만, 뷰가 변경되지 않아도 주 사이트에서 필요한 뷰를 복사해야하므로 뷰에별로 도움이되지 않습니다. 아래의 코드는 다소 고안된 것이지만 내가 생각하는 요점을 얻는다.
namespace MyCompany.Web.Areas.Portal
public class ClientInvoicesController : MyCompany.Web.InvoicesController
{
public new ActionResult List()
{
var clientId = invoiceService.GetCurrentCLientId();
var invoices = invoiceService.GetInvoices(clientId);
return View(invoices.Where(x=>x.HideFromClient != true).ToList());
}
}
은 다른 사람이 비슷한 보았다 적이 있습니까? 나는 내 사고 과정에 대한 두 번째 의견을 얻을 때까지 한 가지 경로 또는 다른 경로로 너무 멀리 가고 싶지 않으므로 제공 할 수있는 도움을 주시면 감사하겠습니다.
지역/{AreaName}/Views 폴더에 있지 않은보기를 사용할 수는 없습니다 (루트의 공유 폴더에 있지 않은 경우). 아니면 제가 잘못 생각합니까? –
Yax, 어디서나 볼 수 있지만 컨벤션 폴더에없는 경우 다음과 같이 절대 경로를 지정해야합니다. @ Html.Partial ("~/path/to/your/view/view.cshtml", model) –
절대 경로를 지정하면 DisplayModes가 필요에 따라 뷰 이름을 여전히 조정할 수 있습니까? 위 예제에서'~/Views/Clients/details.cshtml' 뷰를 요청하면'~/Views/Clients.cshtml' –