2012-01-10 40 views
5

Chúng tôi đang cố gắng sử dụng [AllowHtml] trang trí trên một trong những thuộc tính ViewModel của chúng tôi để chúng tôi có thể tránh được YSOD:AllowHtml không làm việc cho ASP.Net MVC 3 trang web

Một Request.Form nguy hiểm giá trị được phát hiện từ ứng dụng (RequestText = "<br>").

khi chúng tôi cố gắng gửi văn bản html, như: <br>. Chúng tôi muốn sử dụng Server.HtmlEncode trong hành động điều khiển để ngăn chặn các cuộc tấn công, nhưng khi chúng tôi trang trí thuộc tính với [AllowHtml] nó không ảnh hưởng và nếu chúng tôi cố sử dụng [ValidateInput(false)] trên hành động của bộ điều khiển, nó cũng không có tác dụng. Chúng tôi nhìn thấy một StackOverflow Post nói rằng trong MVC 3 RC2 rằng bạn phải thêm:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); đối với global.asax

Chúng tôi cũng đã thử điều đó, mặc dù chúng tôi đang sử dụng phiên bản phát hành MVC 3, chứ không phải RC2, nhưng điều đó cũng không có tác dụng. Có ai biết làm thế nào để sửa lỗi này?

mẫu:

namespace UI.Models.ViewModel 
{ 
    public class CustomerRequestSupport 
    { 
     /// <summary> 
     /// Gets or Sets the textual description entered by the Customer for 
     /// the support requested. 
     /// </summary> 
     [AllowHtml] 
     public string RequestText { get; set; } 
    } 
} 

Bộ điều khiển:

[HttpPost] 
    [TabsActionFilter] 
    public ActionResult RequestSupport(CustomerRequestSupport collection) 
    { 
     if (ModelState.IsValid) 
     { 

      Ticket ticket = new Ticket(); 

      ticket.Requestor = LoggedInCustomer; 

      ticket.Summary = "General Support Ticket"; 
      ticket.Notes = Server.HtmlEncode(collection.RequestText); 

      var errors = _ticketService.SubmitTicket(ticket); 

      if (errors.Any()) 
      { 
       ModelState.AddModelError("collection", 
        String.Format("An error has occurred in your Request for Support: " + 
        "{0} Please try again later or call the help desk " + 
        "for immediate assistance.", 
        errors.Aggregate((acc, st) => acc + " " + st))); 
      } 
      else 
      { 
       TempData["FlashMessage"] = String.Format("Your request for support has been " + 
         "submitted, the Ticket Number is: {0}.", ticket.TicketNumber); 

       return AutoMapView<CustomerDetails>(View("Details", base.LoggedInCustomer)); 
      } 
     } 

     //needed for tabs to show 
     ViewData.CustomerContactSet(base.LoggedInCustomer); 

     return View(); 

Xem:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"  Inherits="System.Web.Mvc.ViewPage<UI.Models.ViewModel.CustomerRequestSupport>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
Request Support 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server"> 
Request Support 
</asp:Content> 

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm()) 
    { %> 
    <%= Html.ValidationSummary() %> 
    <h2>Enter a description of the support needed</h2> 
    <%: Html.TextAreaFor(m => m.RequestText, 4, 90, null) %> 
    <input type="submit" value="Submit" /> 
<% } %> 
</asp:Content> 
<asp:Content ID="Content4" ContentPlaceHolderID="JavaScriptContent" runat="server"> 
</asp:Content> 

Trả lời

2

Trong answer Darin mình chắc chắn là một cái gì đó lên khi ông hỏi

Vì vậy, bạn gotta được làm điều gì đó khác với những gì tôi đã giới thiệu ở đây. Nó là gì?

Tôi đoán bạn có điều gì khác ảnh hưởng đến đường dẫn ASP.NET đang truy cập vào số FormCollection trước khi tính đến số [AllowHtml] của bạn. Trên đỉnh đầu của tôi một số thư viện phổ biến ASP.NET MVC OSS mà chạm vào đường ống là ELMAH, Glimpse, WebActivator, MvcContrib, có nhiều hơn nữa nhưng bạn có được ý tưởng.

Tôi phải tin rằng bạn đang sử dụng một trong các công cụ ở trên hoặc điều gì đó tương tự.Giả sử bạn chắc chắn rằng bạn đang sử dụng bản phát hành mới nhất và kiểm tra báo cáo lỗi mở của họ.

Cuối cùng, một cách nhanh chóng để xác định xem mã của nó, ví dụ MVC của bạn hoặc thư viện OSS sẽ là tạo dự án thử nghiệm. Hãy thử tạo một dự án vanilla ASP.NET MVC. Đảm bảo rằng AllowHtml hoạt động. Sau đó thêm vào các thành phần PMNM khác nhau của bạn cho đến khi nó bị hỏng. Chỉ cần chắc chắn khi bạn thêm vào các thành phần OSS mà các phiên bản khớp với những gì bạn đang sử dụng trong dự án hiện tại của bạn.

+0

chỉ ra rằng chúng tôi đang sử dụng phiên bản 0.81 của Glimpse và khi chúng tôi cập nhật lên phiên bản phát hành hiện tại, nó hiện đang hoạt động tốt. –

7

Bạn gotta được làm gì đó sai. Thật không may như bạn đã không hiển thị ví dụ của bạn, chúng tôi không thể biết những gì bạn đang làm sai. Vì vậy, hãy để tôi viết cho em một ví dụ làm việc đầy đủ:

mẫu:

public class MyViewModel 
{ 
    [AllowHtml] 
    public string RequestText { get; set; } 
} 

Bộ điều khiển:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      RequestText = "<strong>Hello World</strong>"; 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

Xem:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.TextAreaFor(x => x.RequestText) 
    <button type="submit">OK</button> 
} 

Vì vậy, bạn gotta được làm điều gì đó khác với những gì Tôi đã cho thấy ở đây. Nó là gì?

+0

Darin - Cảm ơn bài đăng, tôi đã thêm mã ở trên. Chúng tôi đang làm một vài điều bổ sung trong mã, nhưng tôi nghĩ rằng nó đang theo cùng một mô hình cơ bản mà bạn vạch ra cho tôi. Tôi không thấy bất kỳ lý do nào khiến mã tôi gửi ở trên không hoạt động. –

+0

@RussClark, không thể thấy bất kỳ điều gì sai với mã của bạn. Nếu bạn có thể gửi cho tôi một dự án mẫu VS minh họa vấn đề tôi sẽ rất vui khi được xem và cố gắng giúp bạn. –

+0

@DarinDimitrov cảm ơn đề xuất của bạn, nó đã làm tôi ngạc nhiên (http://stackoverflow.com/a/8838807/61654) dường như đã khắc phục được sự cố. – ahsteele

Các vấn đề liên quan