gpt4 book ai didi

.net - 'custom environment' 中的 Razor 不接受 @model 指令

转载 作者:行者123 更新时间:2023-12-04 18:14:47 25 4
gpt4 key购买 nike

我正在尝试在沙盒环境中解析和编译 Razor 模板,也就是基于 this 的自定义主机信息(架构见下文)。

我在让智能感知工作时遇到了麻烦,所以我指定了一个 BuildProvider如前所述 here并遵循' workaround '在该问题的答案中提供。

@model MyAssembly.MyModel智能感知给出以下错误:

Could not load file or assembly 'System.Web.WebPages.Razor' or one of it's dependencies.



(程序集 在本地引用和复制,以及所有其他相关的 Razor 程序集)

但是在解析和编译模板时会抛出以下错误:

Line: 33 Col: 7 Error: The name 'model' does not exist in the current context



任何线索/建议?

附言如果我删除 @model 指令,模板会解析并编译正常

建筑学:
  • Web 应用程序:引用类库并使用 3d 方类库中的模型提供 .cshtml 模板文件。
  • 类库:包含 RazorHost 和 BaseTemplate 并引用 3d 方库将模型添加到 web 应用程序提供的 .cshtml 文件中。
  • 3d派对类:为web应用程序提供模型
  • 最佳答案

    @model是 MVC 的 Razor 实现非常特定的东西。因此,开箱即用,它不起作用。我已经在 codeplex 上向 RazorEngine 上传了一个补丁,其中添加了 @model支持它的引擎,并且在该特定版本之外实现它会很容易。 http://razorengine.codeplex.com/SourceControl/list/patches

    它基本上涉及覆盖 razor 用来生成它的类文件的 CodeGenerator 并覆盖 TryVisitSpecialSpan

    protected override bool TryVisitSpecialSpan(Span span) {
    return TryVisit<ModelSpan>(span, VisitModelSpan);
    //This is where you would add more special span tests
    //|| TryVisit<SomeOtherSpan>(span, Method);
    }

    void VisitModelSpan(ModelSpan span) {
    string modelName = span.ModelTypeName;

    if (DesignTimeMode) {
    WriteHelperVariable(span.Content, "__modelHelper");
    }
    }

    然后你还必须创建自己的 CSharpCodeParser
        public class CSharpRazorCodeParser : CSharpCodeParser {
    public string TypeName { get; set; }

    public CSharpRazorCodeParser() {
    RazorKeywords.Add("model", WrapSimpleBlockParser(System.Web.Razor.Parser.SyntaxTree.BlockType.Directive, ParseModelStatement));
    }

    bool ParseModelStatement(CodeBlockInfo block) {
    End(MetaCodeSpan.Create);

    SourceLocation endModelLocation = CurrentLocation;

    Context.AcceptWhiteSpace(includeNewLines: false);

    if (ParserHelpers.IsIdentifierStart(CurrentCharacter)) {
    using (Context.StartTemporaryBuffer()) {
    AcceptTypeName();
    Context.AcceptTemporaryBuffer();
    }
    } else {
    OnError(endModelLocation, "Model Keyword Must Be Followed By Type Name");
    }

    End(ModelSpan.Create(Context, TypeName));

    return false;
    }
    }

    即使在那之后,您也必须覆盖 Host 才能使用您的新类
    public class RazorEngineHost : System.Web.Razor.RazorEngineHost {

    public RazorEngineHost(RazorCodeLanguage codeLanguage, Func<MarkupParser> markupParserFactory)
    : base(codeLanguage, markupParserFactory) { }

    public override System.Web.Razor.Generator.RazorCodeGenerator DecorateCodeGenerator(System.Web.Razor.Generator.RazorCodeGenerator generator) {
    if (generator is CSharpRazorCodeGenerator) {
    return new CSharpRazorCodeGenerator(generator.ClassName,
    generator.RootNamespaceName,
    generator.SourceFileName,
    generator.Host, false);
    }

    return base.DecorateCodeGenerator(generator);
    }

    public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser) {
    if (incomingCodeParser is CSharpCodeParser) {
    return new CSharpRazorCodeParser();
    } else {
    return base.DecorateCodeParser(incomingCodeParser);
    }
    }
    }

    您还必须创建自己的自定义 CodeSpan
    public class ModelSpan : CodeSpan {
    public ModelSpan(SourceLocation start, string content, string modelTypeName) : base(start, content) {
    this.ModelTypeName = modelTypeName;
    }

    public string ModelTypeName { get; private set; }

    public override int GetHashCode() {
    return base.GetHashCode() ^ (ModelTypeName ?? String.Empty).GetHashCode();
    }

    public override bool Equals(object obj) {
    ModelSpan span = obj as ModelSpan;
    return span != null && Equals(span);
    }

    private bool Equals(ModelSpan span) {
    return base.Equals(span) && string.Equals(ModelTypeName, span.ModelTypeName, StringComparison.Ordinal);
    }

    public new static ModelSpan Create(ParserContext context, string modelTypeName) {
    return new ModelSpan(context.CurrentSpanStart, context.ContentBuffer.ToString(), modelTypeName);
    }
    }

    除了告诉设计者使用什么模型之外,这个实现不做任何事情。它根本不应该影响编译,但允许编译器忽略此特定命令。

    关于.net - 'custom environment' 中的 Razor 不接受 @model 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5806388/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com