返回编码html的asp.net mvc 3正则表达式? 公共静态字符串MakeAnchor(字符串文本) { 字符串模式=@“((?\w+):\/\/(?[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)”; Regex r=新的Regex(模式,RegexOptions.Multiline); var anchor=r.Replace(文本“”); 回锚; }

返回编码html的asp.net mvc 3正则表达式? 公共静态字符串MakeAnchor(字符串文本) { 字符串模式=@“((?\w+):\/\/(?[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)”; Regex r=新的Regex(模式,RegexOptions.Multiline); var anchor=r.Replace(文本“”); 回锚; },asp.net,regex,asp.net-mvc-3,razor,Asp.net,Regex,Asp.net Mvc 3,Razor,此方法返回a href=”http://google.com/“target=“\u blank”http://google.com//a如果我传递一些包含 而不是a href=”http://google.com/“target=“\u blank”http://google.com//a 我在MVC3中使用razor视图。我被难住了。MVC 3中是否有某种我不知道的新视图编码?如果使用@:(在Razor中)或使方法返回一个,以向框架指示输出已经编码 最简单的实现是返回新的HtmlString

此方法返回
a href=”http://google.com/“target=“\u blank”http://google.com//a
如果我传递一些包含

而不是
a href=”http://google.com/“target=“\u blank”http://google.com//a


我在MVC3中使用razor视图。我被难住了。MVC 3中是否有某种我不知道的新视图编码?

如果使用@:(在Razor中)或使方法返回一个,以向框架指示输出已经编码

最简单的实现是
返回新的HtmlString(锚定)


IHtmlString
是在.NET4中实现的,因此如果您在.NET3.5中,则必须使用
@=
Htmlstring作为答案

public static string MakeAnchor(string text) 
{
    string pattern = @"((?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)";
    Regex r = new Regex(pattern, RegexOptions.Multiline);
    var anchor = r.Replace(text, "<a href=\"$1\" target=\"_blank\">$1</a>");
    return anchor;
}
我找到了这篇博文(http://www.akngo.com/)这显示了如何为了方便起见“包装”Htmlstring。用法是RawView.SomeString

我用剃须刀引擎已经有一年了 几天了,我很喜欢 很多。我注意到一个大问题,对吗 从一开始,所有字符串都是HTML 编码的。对于我们的使用,这将成为 当我们 处理JSON字符串。例如 给定一个简单的JSON字符串,[“1”,“2”, “3”、“4”]

此文件的实际HTML编码输出 变成,[“1”,“2”, “3”、“4”]

引号已转义,这是 不是期望的输出。如果我们需要 将HTML或XML发送回,我们会 然后必须单独逃跑 那些总的来说,我觉得这很有趣 很烦人,因为我们得把它包起来 HtmlString的内部,如中所示 这是一根柱子

在我们的场景中,我们正在生成 来自C#的JSON/XML,因此大多数情况下, 我们的序列化数据位于 视图模型。这将导致我们 做一些事情,比如,@(新的) HtmlString(View.Foo))@(新建 HtmlString(View.Bar))

正如你所看到的,这可能会变得相当复杂 大而笨重的所以我决定 剽窃MVC的一部分以创建 罗维尤。最终,使用将 be@RawView.Foo@RawView.Bar

我还允许使用 在这种情况下,索引运算符的 有必要用一根绳子把它绕过去 钥匙清单假设我们有富, 在我们的ViewModel中有Bar和Baz@{ 列表键=新列表{“Foo”、“Bar”、“Baz”}; foreach(var键入键){ @罗维尤[关键] }}

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
要做到这一点,我需要 复制DynamicViewDataDictionary。 当然,我给它起了个名字 DynamicRawViewDataDictionary,公共 类DynamicRawViewDataDictionary: 动态对象 { 私有只读Func viewThunk; 公共DynamicRawViewDataDictionary(Func viewThunk) { this.viewThunk=viewThunk; }

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
输出对象结果) { 结果=getData(binder.Name); 返回true; }

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
对象值) { setData(binder.Name、value); 返回true; }

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
重复的原因是 因为DynamicView数据字典 是一个内部密封类。有 我不可能逃避这个 复制和复制以外的限制 粘贴。我对 这个类是getData方法 选中以查看对象是否为 绳子,如果是的话,我用一根绳子把它包起来 HtmlString()

现在我需要在一个 WebViewPage,由于所有视图,我 要拥有自定义版本的 还有WebViewPage,这是件好事 MS没有把这个类内部化 密封,所以我可以很容易地继承 它。我需要做一个通用的和 非通用版本,我只是扑通一声 这两个文件都在一个文件中。 公共抽象类 CustomWebViewPage: WebViewPage { 私有DynamicRawViewDataDictionary_rawData; 公共动态视图 { 得到 { 如果(_rawData==null) { _rawData=新的DynamicRawViewDataDictionary(()=> 视图数据); } 返回原始数据; } } }

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
视图数据); } 返回原始数据; } } }

@(new HtmlString(SomeString))
    private ViewDataDictionary ViewData
    {
        get
        {
            ViewDataDictionary viewData = this.viewThunk();
            return viewData;
        }
    }

    public object this[string key]
    {
        set { setData(key, value); }
        get { return getData(key); }
    }

    public override IEnumerable<string>
    public override bool TryGetMember(GetMemberBinder binder,
    public override bool TrySetMember(SetMemberBinder binder,
让最后一次触球真正发挥作用 这项工作,在cshtml的顶部 文件,你应该有, @继承 Namespace.To.CustomWebViewPage

//或“继承” Namespace.To.CustomWebViewPage

现在,cshtml文件继承自 新的CustomWebViewPage,它应该 有权访问RawView,它将 用HtmlString包装所有字符串

一旦你准备好了,你就会 仍然需要确保所有的 您的新视图继承自 CustomWebViewPage。我极力推荐 在应用程序中使用自定义代码模板 生成视图的MVC项目。这 这将有助于自动化许多 平凡的任务


该方法实际上并没有显示它在调试器中返回编码字符串,只是视图以这种方式写入。