textarea与编写代码

时间:2014-02-17 15:20:27

标签: c# html asp.net

我受到以下的影响

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Posts</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>


        <div class="editor-label">
            <h4>Теги:</h4>
        </div>
        <div class="editor-field">
            <input type="text" name="tags" value="@ViewBag.Tags"/><br />
        </div>

        @Html.HiddenFor(model => model.DateTime, new { @Value = System.DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss") })
        @Html.ValidationMessageFor(model => model.DateTime)

        <h5>body:</h5><textarea name="body" rows="10" cols="80" required >
</textarea><br />

        <div class="editor-label">
            @Html.LabelFor(model => model.Avtor)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Avtor)
            @Html.ValidationMessageFor(model => model.Avtor)
        </div>

        <p>
            <input type="submit" value="save" />
        </p>
    </fieldset>
}

in

public ActionResult Create([Bind(Include = "Id,Title,DateTime,Body,Avtor")] Posts post, string tags, string body)
    {
        if (ModelState.IsValid)
        {
            tags = tags ?? string.Empty;
            string[] tagNames = tags.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string tagName in tagNames)
            {
                post.Tags.Add(GetTag(tagName));
            }
            post.Body = body;
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(post);
    }

公共部分类帖子

{
    public Posts()
    {
        this.Comments = new HashSet<Comments>();
        this.Tags = new HashSet<Tags>();
    }
    public int Id { get; set; }

    [Required]
    [StringLength(64, MinimumLength = 1)]
    public string Title { get; set; }

    public System.DateTime DateTime { get; set; }


    [Required]
    [AllowHtml]
    public string Body { get; set; }

    [Required]
    [StringLength(64, MinimumLength = 1)]
    public string Avtor { get; set; }

    public virtual ICollection<Comments> Comments { get; set; }
    public virtual ICollection<Tags> Tags { get; set; }
}

如果用户在textarea中拨打纯文本,那没关系,但是需要添加代码文本。它会生成<pre> and <code>,但它只能在程序中使用,而不是textarea中的用户。严格来说,如何在tehtarea中这样做可以编写代码并将其保存在数据库中,而不是使用<a> <script>得到错误,并且可以在文本中看到它们。所以航天器本身就是在这个网站上实现的。提前谢谢。

2 个答案:

答案 0 :(得分:1)

创建强类型模型以接受发布到服务器的数据,使用数据注释AllowHtml接受HTML作为输入:

public class SomeViewModel
{
    Posts Post { get; set; }

    [AllowHtml]
    public string Body { get; set; }
}

然后将控制器更改为

public ActionResult Create(SomeViewModel model)
{
    if (ModelState.IsValid)
    {
        model.Post.Body = model.Body;
        db.Posts.Add(model.Post);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return RedirectToAction("Index");
}

还可以尝试将其添加到页面部分正上方的web.config文件中的以下位置:

<system.web>
  ...
  <httpRuntime requestValidationMode="2.0" enableVersionHeader="false" />

  <pages...
  ...
</system.web>

更改请求验证模式基本上只会验证页面而不是每个http请求。您可以在MSDN HttpRuntimeSection.RequestValidationMode

上阅读更多相关信息

答案 1 :(得分:0)

使用AllowHTMLAttribute

请参阅此MSDN

这只允许在viewmodel中为该特定字段提供html,但不允许使用html。

或者您可以这样做:

[ValidateInput(false)]
public ActionResult someAction(SomeViewModel model)
{
    //Your code to handle the control
}

编辑:请注意,您的textarea不是HTML中模型的一部分,您可以将<textarea name="body"....行更改为:

@Html.TextArea("body", new { rows=10, columns=80 })

之后,您的body textarea元素应该能够将HTML元素捕获到您的控制器。