Я могу определить пользовательское местоположение для “поиска представлений” в ASP.NET MVC?

Ну, я сделал это:

 zipStream = new ZipInputStream(channelSftp.get("Port_Increment_201405261400_2251.zip"));
 zipStream.getNextEntry();

 sc = new Scanner(zipStream);
 while (sc.hasNextLine()) {
     System.out.println(sc.nextLine());
 }

Он помогает мне читать содержимое ZIP без записи в другой файл.

103
задан Daniel Schaffer 11 March 2009 в 01:09
поделиться

4 ответа

Вы можете легко расширить WebFormViewEngine, указав все места, в которых вы хотите искать:

public class CustomViewEngine : WebFormViewEngine
{
    public CustomViewEngine()
    {
        var viewLocations =  new[] {  
            "~/Views/{1}/{0}.aspx",  
            "~/Views/{1}/{0}.ascx",  
            "~/Views/Shared/{0}.aspx",  
            "~/Views/Shared/{0}.ascx",  
            "~/AnotherPath/Views/{0}.ascx"
            // etc
        };

        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }
}

Убедитесь, что вы не забыли зарегистрировать механизм просмотра, изменив метод Application_Start в вашем Global.asax. cs

protected void Application_Start()
{
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new CustomViewEngine());
}
120
ответ дан 24 November 2019 в 04:16
поделиться

В последний раз я проверил, это требует, чтобы Вы создали свой собственный ViewEngine. Я не знаю, помогли ли они в RC1 все же.

основной подход я использовал, прежде чем первый RC был, в моем собственном ViewEngine, чтобы разделить пространство имен контроллера и искать папки, которые соответствовали частям.

РЕДАКТИРОВАНИЕ:

Возвратился и нашел код. Вот общее представление.

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName)
{
    string ns = controllerContext.Controller.GetType().Namespace;
    string controller = controllerContext.Controller.GetType().Name.Replace("Controller", "");

    //try to find the view
    string rel = "~/Views/" +
        (
            ns == baseControllerNamespace ? "" :
            ns.Substring(baseControllerNamespace.Length + 1).Replace(".", "/") + "/"
        )
        + controller;
    string[] pathsToSearch = new string[]{
        rel+"/"+viewName+".aspx",
        rel+"/"+viewName+".ascx"
    };

    string viewPath = null;
    foreach (var path in pathsToSearch)
    {
        if (this.VirtualPathProvider.FileExists(path))
        {
            viewPath = path;
            break;
        }
    }

    if (viewPath != null)
    {
        string masterPath = null;

        //try find the master
        if (!string.IsNullOrEmpty(masterName))
        {

            string[] masterPathsToSearch = new string[]{
                rel+"/"+masterName+".master",
                "~/Views/"+ controller +"/"+ masterName+".master",
                "~/Views/Shared/"+ masterName+".master"
            };


            foreach (var path in masterPathsToSearch)
            {
                if (this.VirtualPathProvider.FileExists(path))
                {
                    masterPath = path;
                    break;
                }
            }
        }

        if (string.IsNullOrEmpty(masterName) || masterPath != null)
        {
            return new ViewEngineResult(
                this.CreateView(controllerContext, viewPath, masterPath), this);
        }
    }

    //try default implementation
    var result = base.FindView(controllerContext, viewName, masterName);
    if (result.View == null)
    {
        //add the location searched
        return new ViewEngineResult(pathsToSearch);
    }
    return result;
}
3
ответ дан Joel 5 November 2019 в 11:17
поделиться

Попробуйте что-нибудь вроде этого:

private static void RegisterViewEngines(ICollection<IViewEngine> engines)
{
    engines.Add(new WebFormViewEngine
    {
        MasterLocationFormats = new[] {"~/App/Views/Admin/{0}.master"},
        PartialViewLocationFormats = new[] {"~/App/Views/Admin//{1}/{0}.ascx"},
        ViewLocationFormats = new[] {"~/App/Views/Admin//{1}/{0}.aspx"}
    });
}

protected void Application_Start()
{
    RegisterViewEngines(ViewEngines.Engines);
}
3
ответ дан 24 November 2019 в 04:16
поделиться

Примечание: для ASP.NET MVC 2 у них есть дополнительные пути к расположению, которые вам нужно будет задать для представлений в «Областях».

 AreaViewLocationFormats
 AreaPartialViewLocationFormats
 AreaMasterLocationFormats

Создание механизма представления для области описано в блоге Фила .

Примечание. Это предварительный выпуск 1, поэтому в него могут быть внесены изменения.

3
ответ дан 24 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: