2011-07-11 42 views
5

Trong Asp.net MVC, Razor chèn thêm khoảng trống giữa các khối văn bản. Tôi muốn hiển thị danh sách theo cách này: "1, 2, 3" nhưng nhận được "1, 2, 3".ASP.NET MVC Razor thêm khoảng trống được hiển thị

@for (int i = 1; i < 3; i++) 
{ 
    <text>@i</text> 
    if (i != 2) 
    { 
    <text>, </text> 
    } 
} 

Có cách nào để xóa thêm khoảng trống không?

+0

Tại sao bạn có một khoảng trống sau dấu phẩy trong '' t thứ hai ag? –

+4

có thể trùng lặp [asp.net mvc dao cạo thêm không gian] (http: // stackoverflow.com/questions/4282572/asp-net-mvc-dao cạo-extra-space) – StriplingWarrior

Trả lời

6

Tôi muốn làm một danh sách như sau: "1, 2, 3"

Nhanh chóng và bẩn:

@string.Join(", ", Enumerable.Range(1, 3)) 

Rõ ràng là một helper tùy chỉnh có vẻ thích hợp hơn đối với công việc của định dạng một cái gì đó trong giao diện:

public static class HtmlExtensions 
{ 
    public static IHtmlString FormatList(this HtmlHelper html, IEnumerable<int> list) 
    { 
     return MvcHtmlString.Create(string.Join(", ", list)); 
    } 
} 

và sau đó chỉ cần:

@Html.FormatList(Model.MyList) 
1

Thay vì viết ra các đoạn văn bản ở các vị trí khác nhau mỗi lần vòng lặp, bạn có thể tích lũy tất cả văn bản trong một StringBuilder, sau đó bên ngoài vòng lặp làm @stringBuilderObject.ToString().

+2

Điều đó vi phạm toàn bộ điểm sử dụng các mẫu trang, vì nó yêu cầu nhúng HTML vào chuỗi ký tự chuỗi. Nếu bạn định làm điều đó, tại sao lại có một cái nhìn? Chỉ cần tạo toàn bộ trang trong bộ điều khiển. –

+0

@ David, tôi khá mới với MVC, nhưng tôi không chắc tôi hiểu điểm của bạn. Anh ấy không tạo ra bất kỳ HTML nào, chỉ là văn bản thuần túy. Phần tử '' dành riêng cho Razor, nó được sử dụng để biểu thị văn bản thuần túy. –

+0

Đã hiểu, nhưng có vẻ như đây là một ví dụ rất đơn giản. Nếu không, sử dụng 'chuỗi' sẽ hiệu quả hơn' StringBuilder' cho một khối nhỏ như vậy. Ngoài ra, nó có thể là giá trị thời gian của bạn để xem xét các lớp học mà thời gian chạy tạo ra từ xem. Nó sẽ chăm sóc rất nhiều các bộ đệm mà 'StringBuilder' cung cấp cho bạn đằng sau hậu trường. –

-3

Tôi có thể giả định rằng nó không phải là vấn đề của Razor, mà là phần tử được hiển thị với một số lề.

  1. Mở FireBug (hoặc Chrome hoặc bất kỳ thứ gì) và thấy rằng đó thực sự là vấn đề đánh dấu.
  2. Trong bạn css tập tin thử để thêm

text {margin: 0}

+0

Mã được hiển thị sẽ không thực sự hiển thị bất kỳ phần tử '' nào cho trình duyệt; điều này chỉ được sử dụng bởi Razor để nhận ra các khối văn bản cần hiển thị. Xem phần giải thích của Scott Gu - http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx –

+0

@ Graham .. oops, nó được hiểu .. cảm ơn! –

0

Vấn đề là với các nguồn mà được tạo ra. Khi bạn nhìn vào các nguồn thực tế bạn nhận được:

 
    1 
    , 
    2 
    , 
    3 

Như bạn có thể thấy có rất nhiều khoảng trắng trong đó mà trình duyệt sụp đổ xuống đến một không gian duy nhất (nhìn vào definition for normal).

Sử dụng StringBuilder hoặc string.Join là cách để khắc phục điều này nếu tất cả những gì bạn đang làm là xuất ba số này. Nhưng nếu bạn đang cố gắng làm một cái gì đó khác và đây là một ví dụ đơn giản sau đó see this blog post cho một cách để làm điều đó bằng cách sử dụng ol/ulli s.

6

Bạn đang nhìn thấy khoảng trắng thêm giữa số và dấu phẩy bởi vì mẫu dao cạo của bạn bao gồm một ngắt dòng (hiển thị như khoảng trắng trong trình duyệt) giữa số và dấu phẩy:

@for (int i = 1; i < 3; i++) 
{ 
    <text>@i</text> >LINE BREAK HERE< 
    if (i != 2) 
    { 
    <text>, </text> 
    } 
} 

Tôi thích Darin's answer và tôi sẽ đề xuất xóa vòng lặp của bạn và thay thế bằng tuyên bố khai báo hơn, nhưng nếu bạn không muốn đi xa, hãy thử ít nhất là xóa ngắt dòng:

@for (int i = 1; i < 3; i++) 
{ 
    <text>@i</text>if (i != 2){<text>, </text>} 
} 
Các vấn đề liên quan